1.int*p = NULL; 这时候我们可以通过编译器查看 p 的值为 0x00000000。这句代码的意思是:定义一个指针 变量 p,其指向的内存里面保存的是 int 类型的数据;在定义变量 p 的同时把 p 的值设置为 0x00000000,而不是把*p 的值设置为 0x00000000。这个过程叫做初始化,是在编译的时候 进行的。
int *p=NULL;//p的值为0x00000000 地址
*p=NULL;//*p的值为0 数值
NULL和NUL的区别
NUL代表\0
2.int*p = (int*)0x12ff7c;
*p = 0x100; 需要注意的是将地址 0x12ff7c 赋值给指针变量 p 的时候必须强制转换
3.可修的左值,只能给非只读变量赋值
数组a 可以作为右值代表数组首元素地址,但其不能作为左值。
&a是数组的首地址,&a+1数组结尾 a+1是数组下一个元素首地址
4.*(p+4)类似于p[4]
a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是 a[0]的 首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即 a[1]的首地址,&a+1 是下一 个数组的首地址。所以输出 2
对指针进行加 1 操作,得到的是下一个元素的地址,而不是原有地址值直接加 1。所以, 一个类型为 T 的指针的移动,以 sizeof(T) 为移动单位。
注意区分& [] *
printf("%x",&a+1);打印地址
5.二维数组
a[i] 的首地址为& a[0]+i*sizof(char)*4。
a[i]内有 4 个 char 类型的元素,其每个元素的首地址分别为&a[i],&a[i]+1*sizof(char), &a[i]+2*sizof(char),&a[i]+3*sizof(char),即 a[i][j]的首地址为&a[i]+j*sizof(char)。
a[i][j]元素的首地址为:a+i*sizof(char)*4+j*sizof(char)
*(*(a+i)+j)
a 在这里代表的是 a[0]的首地址。a+1 表示的是一维数组 a 的第二个元素。a[4]表 示的是一维数组 a 的第 5 个元素,而这个元素里又存了一个一维数组。所以&a[4][2]表示的 是&a[0][0]+4*5*sizeof(int)+2*sizeof(int)。
6.一级指针保存的是数据的地址,二级指针保存的是一级指针的地址
C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元 素首地址的指针。
函数的返回值也不能是一个数组, 而只能是指针。这里要明确的一个概念就是:函数本身是没有类型的,只有函数的返回值 才有类型。
7.char* (*fun1)(char* p1,char* p2);
这里 fun1 不是什么函数名,而是一个 指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指 针
还是应该再看几遍