指针的类别就是其+1的时候移动多少,包括所指向变量的类型和个数
指针有两个来源
一是定义的
二是用&取出的,此时指针的类别为被&的变量的类别
指针直接sizeof值为4,数组名直接sizeof值为数组大小
指针用*解引用然后sizeof值为所指向结构的大小
故指针与数组名不是同一类变量
————————
int b[5][5];
b[0]是数组名,不是指针,sizeof(b[0])=4*5=20
————————
运算符优先级() > [] > * > &
int (*a)[5]; //a为数组指针
int *b[5]; //b为指针数组
————————
int a[5];
int *p1;
int (*p2)[5];
sizeof(a)=20 sizeof(&a)=4 sizeof(*(&a))=20
sizeof(p1)=4 sizeof(p2)=4
sizeof(*p1)=4 sizeof(*p2)=20
————————
指针之间互相赋值需要类别相同,类别不同(包括类型不同和个数不同)
时会报error错误
将数组名赋给指针时,数组名传递的是第一个元素的指针(类别为第一个元素的类别)
数组名是不能作为左值的,两个相同类别的数组之间也不能直接整体赋值
int a[5], b[5];
int c[5][5];
int *p1;
int (*p2)[5];
int (*p3)[5][5];
p1 = a; //对,数组名赋给指针
p1 = c[0]; //对,数组名赋给指针
p2 = c; //对,数组名赋给指针
p2 = &a; //对,指针直接互相赋值
p2 = &c[0]; //对,指针直接互相赋值
p3 = &c; //对,指针直接互相赋值
a = b; //错,数组不能直接整体赋值
————————–
int a[5];
sizeof(a)=20 sizeof(a+1)=4
在对数组名加减常量时,a依然表现为第一个元素的指针
故对于数组名,直接sizeof与用&取地址,表现为一个整体数组
赋值给指针和加减常量时,表现为第一个元素的指针