2025/2/17--2/23学习笔记(week1)_C语言

1 整数的存储
  • 只有整数才有原码,反码,补码,原码取反加一(除了符号位)得到补码。补码的补码会变成原码。 在任何位运算里,都是操作的补码,因为整数在内存里都是以补码存储的
2 移位运算符
  • 移位运算符只能用与整数,且移动二进制位的补码,不改变这个数本身的值
  • 左移,左边丢弃,右边补零
  • 右移,分为逻辑和算数(一般)右移,与编辑器有关。1. 逻辑右移:左边⽤0填充,右边丢弃 2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
  • 在进行完位运算后,得到的仍然是补码。
3 位运算符
  • 位操作符 &| ^ ~

  • & 有0则为0,同时为1则为1可以用真假来记

  • | 有1则为1,同时为0才是0

  • ^ 相同为0,相异为1

  • ~ 按位取反,包括符号位

  • 异或的一些技巧

    • 异或支持交换率,即与运算顺序无关 (3^3^5=3^5^3)

    • a^a=0 0^a=a

    • 基于以上特点,可以用于交换两个变量但不使用第三个变量

    • int a = 5;
      int b = 10;
      a = a ^ b;
      b = a ^ b;
      a = a ^ b;
      
4 求一个正数在内存里存储的二进制中的1的个数
  • 方法一:只能用于正数	int count = 0;int n = 15;while (n>0) {if (n % 2 == 1) {count++;}n /= 2;}printf("%d", count);方法二:一个数在&1之后,如果==1,则说明该位是1,否则则为0int count = 0;int n = -1;for (int i = 0; i < 32;i++) {if ((n >> i) & 1 == 1) {count++;}}printf("%d", count);方法三:n = n & (n - 1)这样写执行一次该代码,会去掉二进制里最右边的一个1(相当于将最右边的一个1拆成0……1int count = 0;int n = -1;while (n != 0) {n = n & (n - 1);count++;}printf("%d", count);
5 逗号表达式
  • (……,……,……)从左向右依次进行计算,整个表达式的结果是最后一个表达式的结果,常和while函数一起使用
6 结构体
  • 创建结构体
struct stu {int age;char name[10];
}s2,s3;
  • 初始化,使用{}struct stu s1 = {10,"zhangsan"};。也可以不按顺序初始化struct stu s4 = { .name = "lisi",.age = 20 };
  • 可以用 . 访问成员printf("%d", s1.age);
7 整型提升
  • C语言中整型算术运算总是至少以(int)整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。(在 C 语言中使用char类型变量存储数字时,确实只能存储该数字二进制表示的前 8 位。)
  • 有符号整数提升是按照变量的数据类型的符号位来提升的
  • 无符号整数提升,高位补0
  • 在计算时提升,计算完在截断(char:只能在[-128,127])
  • 在以%d 打印一个char类型的变量的时候,会先对该变量进行整型提升得到补码,在转化为原码进行打印(一般默认是有符号char)
8 算数转换
  • 如果某个操作符的各个操作数属于不同的类型,那么除非其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
  • 在比较有符号整型和无符号整型时,有符号整数会被隐式转换为无符号整数。转换的方式是保留二进制位不变,但是将其解释为无符号数。(例如,在 32 位系统中,有符号整数 -1 的二进制表示是 0xFFFFFFFF(补码形式)。当把它转换为无符号整数时,同样的二进制位 0xFFFFFFFF 会被解释为无符号数 4294967295。)
9 指针
  • 如果对一个(int)类型取地址,取到的是最小那个地址(一个int4个字节,每个字节都有自己对应的地址,&a则代表最小那一个地址)
  • 任何数字存入指针变量里,都会被当作指针处理
  • 一个指针变量在32位机器上是32个0/1组成的序列,需要4个字节来存储,在64位机器上是64个0/1组成的序列,需要8个字节来存储
  • 不同的指针类型,在解引用时访问的字节数与指针类型有关
  • 不同的指针类型,会影响+1的步长
10 void*指针
  • 泛型指针可以理解为⽆具体类型的指针(或者叫泛型指针),这种类型的指针可以⽤来接受任意类型地址。但不能对该指针进行解引用和±操作。经常用于接受不同类型的函数参数,在使用时可以先强制类型转化后在使用。
11 指针运算
  • 指针±整数: *(p+i)或者 scanf(“%d”, p + i),这里的p+i本身就表示一个地址

    • 不只可以加上一个整数,还可以减去一个整数,在这个程序里,int* p = &arr[9];此时p里面存放的是最后一个元素的地址,也可以从这里向前访问。

    • int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
      int* p = &arr[9];
      for (i = 0; i < sz; i++)
      {printf("%d ", *(p - i));
      }
      

  • 指针-指针:

    • 只有指向同一块区域的指针才可以相减(比如指向同一个数组的内存)

    • 相减的结果的绝对值是两个指针之间的元素个数

    • int arr[10] = { 0 };
      int n = &arr[0] - &arr[9];
      printf("%d ", n);
  • 指针的关系运算:(可以用这种关系运算来判断一个数组是否已经结束)

  • int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int* p = arr;
    while (p < &arr[sz]) {printf("%d ", *p);p++;
    }
    
12 strlen函数的实现
方案一:(计数器)
size_t my_strlen(char* str){size_t num = 0;while (*str != '\0') {num++;str++;}return num;
}int main()
{char arr[] = "abcdef";size_t len = my_strlen(arr);printf("%zd", len);return 0;
}
方案二:(运用指针相减)
size_t my_strlen2(char* str) {char* start = str;while (*str != '\0')str++;size_t num = (size_t)(str - start);return num;
}
13 const修饰指针
  • 对于const int n = 10;会让n变成常变量,无法被修改,但仍然是一个变量。

    const修饰的变量不能直接被修改,但可以通过指针侧面进行修改
    const int n = 10;
    int* p=&n ;
    *p = 1;
    printf("%d ", n);如果不想让这个值被指针修改,只需要在int*前也加上const
    const int n = 10;
    const int* p=&n ;
    *p = 1;
    printf("%d ", n);
    
  • const int * p ,const放在左边,修饰的是整个(*p),也就是可以不能修改p指向的内容,但指针变量本身可以修改,即可以从指向a变为指向b

  • int * const p,const放在*的右边,修饰的是p本身,也就是不可以修改p本身,即p的指向,但可以通过p修改p指向的内容即 *p

14 野指针
  • 这里面就造成p变成了一个野指针,因为在test结束的时候,n空间就释放了
    int* test() {int n = 100;return &n;
    }int main() {int* p = test();printf("%d ", *p);return 0;
    }
    
15 assert断言
  • assert包含在头文件<assert.h>里,如果在开头加上#define NDEBUG

会直接让程序里所有的assert断言都失效

  • int* p = &a; assert(p != NULL)如果p为NULL,会直接终止程序
  • 该断言只有在debug模式里才有用,在release模式则会忽略该语句。
16 指针与数组
  • 数组名是数组首元素的地址,但存在两个特殊情况
    • sizeof(数组名) 在这种情况下,数组名表示整个数组,计算出的结果是整个数组的大小,单位是字节
    • &数组名 这里的数组名也是表示整个数组,取出的是整个数组的地址(类型不是int*)
17 一维数组传参的本质
  • 在实际以数组传参的时候,传递的就是一个地址,也就是如果数组经过传参,就彻底变成首元素的地址,没有特殊情况了,不可以用sizeof(arr) / sizeof(arr[0])来计算数组长度了。所以如果想知道数组的长度,必须在传参的时候传过去
18 冒泡排序
  • 两两相邻的元素进行比较

  • 一趟解决一个数字,所以需要(n-1)次

  • void bubble_sort(int* pa,int len) {for (int i = 0; i < len-1; i++) {//控制一共运行几次,如果有n个元素,只需要运行n-1次即可,因为最后一个元素会自行有序int flag = 0;for (int j = 0; j < len-1-i; j++) {//控制在一次循环里比较几对数据if (pa[j] > pa[j + 1]) {int tem = pa[j];pa[j] = pa[j + 1];pa[j + 1] = tem;flag = 1;}}if (flag == 0) {break;}}
    }//flag是为了优化代码,如果有一次外层循环一次都没有交换(flag==0),则说明已经有序,可以直接结束(break)
    
19 二级指针
  • int** p就是二级指针,int *说明p指向一个int *类型的数据,而第二颗 *则说明p是一个指针变量

  • int a = 10;
    int* pa = &a;
    int** ppa = &pa;
    
20 指针数组
  • 存放指针的数组

  • 模拟二维数组(与二维数组有不同,因为二维数组每一行之间是连续空间)

  • int main() {int a[3] = { 1,2,3 };int b[3] = { 4,5,6 };int c[3] = { 7,8,9 };int d[3] = { 10,11,12 };int* arr[4] = { a,b,c,d };//数组名是首元素地址for (int i = 0; i < 4; i++) {for (int j = 0; j < 3; j++) {printf("%d ", arr[i][j]);}printf("\n");}return 0;
    }
    
21 字符指针
  • 在打印字符串的时候,只需要传入该字符数组首元素的地址const char* p = "hdjslds";printf("%s",p);

  • 字符指针可以被赋为字符数组,也可以直接用常量字符串赋值,两者的区别是常量字符串不可以被修改

  • char* p = "hdjslds";char arr[10] = "hdjslds";
    char* p = arr;
  • 对于同一个常量字符串,即使使用多个指针变量指向它,都指向的是同一块内存空间(即同一个常量字符串,因为它无法被修改,所以没必要创建多个)

  • const char* str1 = "hello";
    const char* str2 = "hello";
    if (str1 == str2) {printf("same");
    }
    
22 数组指针变量
  • 指向整个数组的指针
  • int(*p)[5] 其中(*p)说明p是一个指针变量,[5]说明p指向的是一整个数组,5代表元素个数,int 代表指向这个数组里边存放的元素的数据类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23561.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot的党员学习交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

LeetCode 114.二叉树展开为链表

题目&#xff1a; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…

自然语言处理NLP 04案例——苏宁易购优质评论与差评分析

上一篇文章&#xff0c;我们爬取了苏宁易购平台某产品的优质评价和差评&#xff0c;今天我们对优质评价与差评进行分析 selenium爬取苏宁易购平台某产品的评论-CSDN博客 目录 1. 数据加载 2. 中文分词 3. 停用词处理 4. 数据标注与合并 5. 数据集划分 6. 文本特征提取 …

20250223下载并制作RTX2080Ti显卡的显存的测试工具mats

20250223下载并制作RTX2080Ti显卡的显存的测试工具mats 2025/2/23 23:23 缘起&#xff1a;我使用X99的主板&#xff0c;使用二手的RTX2080Ti显卡【显存22GB版本&#xff0c;准备学习AI的】 但是半年后发现看大码率的视频容易花屏&#xff0c;最初以为是WIN10经常更换显卡/来回更…

【JavaEE进阶】Spring Boot配置文件

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 SpringBoot配置⽂件 举例: 通过配置文件修改端口号 配置⽂件的格式 properties基本语法 读取配置⽂件 properties配置文件的缺点 yml配置⽂件 yml基本语法 yml和proper…

Docker内存芭蕾:优雅调整容器内存的极限艺术

title: “&#x1f4be; Docker内存芭蕾&#xff1a;优雅调整容器内存的极限艺术” author: “Cjs” date: “2025-2-23” emoji: “&#x1fa70;&#x1f4a5;&#x1f4ca;” 当你的容器变成内存吸血鬼时… &#x1f680; 完美内存编排示范 &#x1f4dc; 智能内存管家脚本…

【Godot4.3】题目与答案解析合并器

免责申明 本文和工具截图中涉及题库和题目&#xff0c;均为本人自学使用&#xff0c;并未有商业和传播企图。如有侵害&#xff0c;联系删改。 概述 笔者本人医学专业从业人员&#xff0c;编程只是业余爱好。在自己的专业应考学习过程当中&#xff1a; 有时候不太喜欢纸质题库…

学习笔记-250222

论文&#xff1a; Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models 主要研究llm在图像分类中的能力&#xff0c;当提示输入目标类别时&#xff0c;llm能够生成相关的描述以及相应的结构化关系。 1.首先利用llm从普通的描述中获…

欧拉回路与哈密尔顿回路: Fleury算法与Hierholzer 算法(C++)

图论中的回路是指一个路径, 它从某个顶点开始, 经过所有边恰好一次, 并回到起始顶点. 定义 欧拉回路: 从一个顶点出发, 经过每条边恰好一次, 并且最终回到起始顶点. 哈密尔顿回路: 从一个顶点出发, 经过每个顶点恰好一次, 并且最终回到起始顶点. 欧拉路径: 从一个顶点出发, …

从图片生成3维场景--NERF原理解析及加速版HashNeRF-pytorch代码实现

概要 NeRF&#xff08;Neural Radiance Fields&#xff09;是一种基于神经网络的三维图像生成技术&#xff0c;通过一组从不同角度拍摄的2D图片&#xff0c;生成一个3D场景&#xff0c;并且能够渲染出该场景在任意视角下的图像。这项技术的核心思想是利用神经网络的强大建模能…

PHP-综合4

[题目信息]&#xff1a; 题目名称题目难度PHP-综合42 [题目考点]&#xff1a; PHP综合训练[Flag格式]: SangFor{Ouk3i63BuShgxqdRcn_9kMNqKFDe5j4f}[环境部署]&#xff1a; docker-compose.yml文件或者docker tar原始文件。 http://分配ip:2087[题目writeup]&#xff1a;…

爱普生SG-8101CE可编程晶振赋能智能手机的精准心脏

在智能手机高速迭代的今天&#xff0c;高性能、低功耗与小型化已成为核心诉求。智能手机作为人们生活中不可或缺的工具&#xff0c;需要在各种复杂场景下稳定运行。爱普生SG-8101CE可编程晶振凭借其卓越性能&#xff0c;成为智能手机中不可或缺的精密时钟源&#xff0c;为通信、…

基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“流浪动物救助系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…

【AI】模型量化--模型量化技术基础

1. 背景 对于接触过AI模型的人来说,经常会听说一个词语模型量化,那什么是模型量化?为什么需要模型量化?有哪些常用的模型量化技术呢?本文将一一展开叙述。 2. 概念 模型量化是一种在深度学习和机器学习领域中广泛应用的技术,旨在通过减少模型中数据的表示精度来降低模…

力扣(leetcode)每日一题 1656 设计有序流

1656. 设计有序流 - 力扣&#xff08;LeetCode&#xff09; 题目 有 n 个 (id, value) 对&#xff0c;其中 id 是 1 到 n 之间的一个整数&#xff0c;value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流&#xff0c;以 任意 顺序获取 n 个 (id, value) …

【附源码】基于opencv+pyqt5搭建的人脸识别系统

文章目录 前言一、人脸检测二、人脸识别1.训练识别器2.识别人脸 三、界面相关1.Qlabel展示图片2.表格跟随内容而增加和减少3.选择图片文件4.警告框 四、源码获取总结 前言 人脸识别技术作为人工智能领域的一颗璀璨明珠&#xff0c;正逐渐渗透到我们生活的每一个角落&#xff0…

【一起学Rust | 框架篇 | Tauri2.0框架】在Tauri应用中设置Http头(Headers)

文章目录 前言一、配置准备1. 检查版本2. 使用条件3. 支持的请求头&#xff08;并不是全部支持&#xff09; 二、使用步骤1. 如何配置header2. 框架集成1. 对于Vite系列、Nuxt、Next.js这种前端框架Vite系列框架Angular系列框架Nuxt系列框架Next.js系列框架 2. 对于Yew和Leptos…

计算机毕业设计SpringBoot+Vue.jst0图书馆管理系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

SeaCMS V9海洋影视管理系统报错注入

漏洞背景 SQL 注入攻击是当前网络安全中最常见的一种攻击方式&#xff0c;攻击者可以利用该漏洞访问或操作数据库&#xff0c;造成数据泄露或破坏。通常发生在开发人员未能正确处理用户输入时。 在 SeaCMS V9 中&#xff0c;用户输入&#xff08;如登录、评论、分页、ID 等&a…

Upload-labs

pass-01 先随便上传一个php文件&#xff0c;但提示发现使用了js对不法文件进行了检查&#xff0c;是前端验证 上传php代码<?php phpinfo();?> ,使用bp抓包 将后缀名改为php然后放行 复制图片链接访问&#xff0c;得到有关php的所有信息 Pass-02 根据提示可以知道&…