指针与数组总结
1.&表示取地址 *表示取内存数据(在一些复杂表达式中可能是乘法的意思,注意区别)
2.数组中
数组名表示首层首个元素的地址
&a表示变量的地址 若为数组指针赋值时表示指针偏移量为数组大小(byte)
一维数组
int a[3]={1,2,3};
int *p1=a;//等同于 int *p1=a[0];偏移量为4
int *p2=&a;偏移量为12
a[1]==*(a+1)==p[1]==*(p+1)
二维数组 数组的元素是一个数组
int a[2][3]={1,2,3,4,5,6};
int *p1=a;//等同于 int *p1=&a[0];偏移量为12
int *p2=&a[0][0];//等同于 int *p2=a[0];偏移量为4
a+1//a[1]地址
*(a+1)//a[1]
*(*(a+1)+1)==*(a[1]+1)//等于a[1][1] a换成p同理 只是说a不可变 p可变
a[1]+1//a[1][1]的地址
多级指针
int *p1;
int **p2=&p1;此时*p2=p1;**p2=*p1
int **p2=p1;是错误的 因为声明的类型不符 即偏移量不同
总结
理解 p2指针指向的是一个一级指针类型 若不是则错误
同理int *p3[2]指针数组储存的也是一级指针地址 p3==&p3[0] p3[0]即是一个指针 显然是二级指针
int (*p4)[3]是一个行指针 偏指向一个数组 移量为12 不能为**p赋值 不是二级指针
至于对于二维数组可以使用p4+1 因为后面的空间开辟了
int a[2][3];
a[0]就是一个元素 或 数组
因此赋值是否正确要看声明的类型
void型指针
没有偏移量的指针
赋值时会强转 可以赋不同类型的值