- 一维数组
int a[10] 数组中的几个关键符号 a a[0] &a &a[0]
(1) a是数组名,做左值时代表整个数组空间,C语言规定数组操作时要单个独立操作,不能整体操作数组,所以a不能做左值;做右值时表示数组的首元素的首地址,是这个数组的指针。
(2) a[0]是数组中的第0个元素,做左值时表示数组第0个元素对应的地址空间(连续四个字节的内存空间),做右值时表示第0个元素的值。
(3) &a 就是数组a取地址,表示数组的地址,不能做左值(编译器帮我们分配好数组空间时,数组的地址就已经定了,所以数组的地址是一个常量,所以不能做左值),做右值时表示整个数组的地址。
注意:a 和 &a 的区别,一个是数组的地址,一个是数组的首元素的首地址,虽然值是相同的但是意义是不同的,意义不相同会导致他们在参与运算时的表现不同。
(4) &a[0] 就是数组首元素的首地址,做右值时等同于a是数组首元素的首地址。(我是这么认为的 :由于在定义数组时编译器已经给数组分配好了地址,数组的地址是个常量自然数组的第一个元素的地址也是个常量,所以&a[0] 也不能做左值)
int *p ;int a[5];p = a;//类型匹配。
int *p; int a[5];p = &a ;//类型不匹配,&a是整个数组的地址,是数组指针的类型。
二维数组
int a[2][5] = {1,2,3,4,5,6,7,8,9,0} ;
int *p1 = a;//类型不匹配
int **p2 = a;//类型不匹配
int (*p3)[5];
p3 = a;//类型匹配,数组指针,p3是一个指针,指向一个行元素个数为5 的一维数组,a是二维数组的数组名,做右值时表示二维数组第一维的数组的首元素首地址,等同于&a[0]。数组与指针
指针指向二维数组的第一维
int *p4 = a[0];//类型匹配
指针指向二维数组的第二维
int *p = a[i][j];//类型匹配
指针数组:int *(p[5]) int *p[5] 指针数组,实质是一个数组,这个数组中存储的内容都是指针变量
数组指针: int (*p)[5] 数组指针,实质是一个指针,指针指向的是一个行元素个数为5 的一个数组。
注意:[]的优先级比*的要高,[] . ->这几个优先级比较高。函数与指针
void func1(void);
void (*Pfunc)(void);//函数指针
Pfunc = func1;
Pfunc();等同于func1();typedef char * (pType)(char , const char *);
pType p6;//等效于char * ( * p6)(char * , const char );这个函数的返回值是char *类型的。函数、指针与数组
函数指针数组
typedef char * (* pType[5] )(char * , const char *);//数组里面存放的是函数指针
函数指针数组指针
这里写代码片
typedef char * (*(*pType)[5])(char * , const char *); //(*pType)[5]这一部分是函数指针,本身又是数组指针,所以是函数指针数组指针,数组指针里面存放的是函数指针
本博文只是作为自己的一个笔记(本笔记是跟着朱有鹏老师视频课所做的笔记总结),如果能帮助其他人更好,若有疑问欢迎指出,欢迎加QQ 1922546282,共同讨论与学习。