C语言的知识合集
1 指针
1.1指针是什么?
指针理解的2个要点:
1.指针是内存中一个最小单元的编号,也就是地址
2.平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
int a = 10; //a是整形变量,4个字节空间
int* p = &a; //P是指针变量,用来存放a的地址。
1.2指针变量占用的空间大小?
在32为平台地址是4个字节,在64为平台地址是8个字节
补充:8个bit位一个字节。
16进制中2个数字表示一个字节 可能性= 进制^个数 (金戈铁马)
16^2 = 2^8
1.3关于指针解引用的注意事项
1.指针类型决定这指针解引用到底访问几个字节。
2.决定这指针解引用时以何种数值类型去解读内存中的数据。
int a = ox11223344;
char* p = (char*)&a;
*p = 0;//此时 a为 OX11223300 why?
int* 和 float* 都是4个字节,是否可以混用?
答:不行,因为int和float数据存储型式不同,在解引用时,同一块数据,int类型的解读数来的值,和float解读出来的数据不一致。
注意:int unint flaot 存储型式不同,
小知识:int 和uint 正数存储型式一致,
int >>>uint int负数+2^8
uint >>>int uint-2^8
int 和float存储型式完全不同,差距很大
1.5 指针初始化
int* p = &a; // p与*结合 指向int类型
int* *Ph = &p; // p与*结合 指向int*类型(一级指针)
int** *phh = &ph;//p与*结合 指向int**类型(二级指针)
1.6 指针+1和-1
跳过一个数据类型的存储字节
补充:char 1字节 int 4字节 flaot 4字节
char* p= &a;
p = p+1;//跳过一个char类型占用空间字节数(1字节)
int* pi = &b;
pi = pi+1;//跳过一个int类型占用空间字节数(1字节)
*VP++ = 0 和(*VP)++ = 0; 的区别?
*VP++ = 0 先*VP=0 ,在VP++。 //++最近的是 VP++
(*VP)++ = 0; 先*VP=0 ,在(*VP)++。 //++最近的是 (*VP)++
解析:++在后面,最后才++,先运行除了++之外的语句,也就是先运行(*VP)=0;在运行(与++结合最近的)语句++
1.7 指针 - 指针
指针 - 指针的绝对值 = 指针和指针之间元素的个数
int arr[10] = { 0 };
printf("%d\n",&arr[9]-&arr[0]);// #9
printf("%d\n",&arr[0]-&arr[9]);// #-9

1.8 野指针:
野指针的二种情况:1.未初始化 2.指针越界 3.引用函数内部的局部变量
1.未初始化
int *P;//局部变量P没有初始化,会放入一个随机值,那么在解引用的时候会访问哪里我们不得而知。野指针
*P = 10;
2.指针越界
int arr[10] = { 0 }; //arr[10] 会越界
int *P = arr;
for(i=0;i<=10;i++)
{
*P = i;
p++;
}
3.引用函数内部的局部变量
int* test()
{
int a=10;
retrun &a;
}
int main()
{
int*P = test(); //出了函数,函数内部的空间会被回收。出函数后。a这块空间会回收,此时我们使用这块空间不合法,里面的值也有可能已经被篡改。
}
2. 函数
2.1 函数的定义
2.2 常用的函数
3. 字符串
3.1 字符串的存储
字符结尾 " \0 ",表示后面没有字符。
int len = my_strlen("abcdef");

2952

被折叠的 条评论
为什么被折叠?



