C与指针4——指针
NULL
1、是一个指针变量
2、代表它不指向任何东西
指针的常见运算
int d[4]={1,2,3,4};
int* d0 = &d[0];
int* d1 = &d[1];
//则d0+1 就是 d1
//d1-d0 = 1;
//指针的加法取决于指针所指的对象
//两个指针相减的对象是ptrdiff_t 有符号整形
数组与指针
int a[3]={1,2,3};
int** k = &a;
1、a的数据类型是 指向int类型的常量指针,a == &a[0]
2、&a 是一个指向数组的指针
3、尝试修改a变量的值是不合法的
4、sizeof(a)返回的是数组长度。
int a[3]={1,2,3};
int b[3]={1,2,3};
a=b;//不合法,常量指针禁止修改
5、关键补充:下标引用与间接访问完全相同!
int a[3]={1,2,3};
//1、下标引用a[1] 和 间接访问*(a+1) 等价
int* pa = a+1;
//2、pa[0] 是合法的。pa[0]==*(a+1)
//3、pa[-1]是合法的。pa[-1]==*(a)
6、补充说明:数组名和指针不等价!
1、a是一个常指针,但是b的指向可改变。
2、数组名和指针进行sizeof结果不同。
int a[5];
int* b=&a[1];
sizeof(a)==20//5个元素*4 = 20 字节
sizeof(b)=4;//4个字节
3、同:都可以进行下标引用和间接访问的操作。
二维数组
1、补充说明:不管是几维数组,在空间中都是顺序存储的。而且是行优先
int aa[2][3]={{1,2,3},{1,2,3}};//合法
int aa[2][3]={1,2,3,1,2,3};//也是合法
2、sizeof的作用也是完全相同
int aa[2][3]={{1,2,3},{1,2,3}};//合法
sizeof(aa)=24;
3、二维数组与指针
int aa[2][3]={{1,2,3},{1,2,3}};
sizeof(aa)=24;
sizeof(*aa)=12;
3-1、aa是二维数组名、指向第一个一维数组的常指针
3-2、aa+1 代表指向第二个一维数组的常指针。
3-3、下标引用与间接访问等价,*(aa+1) 和 aa[1]均表示
指向第二个一维数组的第一个元素的常指针。
3-3、aa[1][2] = *(aa[1]+2) = *(*(aa+1)+2)
2、补充说明:如何声明一个指向数组的指针
int (*p)[10];//这就是一个指向数组的指针,该数组的长度为10
int a[10];
p = &a;
int aa[2][3];
p = aa;//p是一个指向数组的指针,指向的数组是aa的第一个一维数组
3、函数传参为指针的等价
void func(int d[2][3])
void func(int (*p)[3])