C语言篇之数组、函数与指针

  1. 一维数组
    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是整个数组的地址,是数组指针的类型。

  1. 二维数组

    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]。

  2. 数组与指针
    指针指向二维数组的第一维
    int *p4 = a[0];//类型匹配
    指针指向二维数组的第二维
    int *p = a[i][j];//类型匹配
    指针数组:int *(p[5]) int *p[5] 指针数组,实质是一个数组,这个数组中存储的内容都是指针变量
    数组指针: int (*p)[5] 数组指针,实质是一个指针,指针指向的是一个行元素个数为5 的一个数组。
    注意:[]的优先级比*的要高,[] . ->这几个优先级比较高。

  3. 函数与指针

    void func1(void);
    void (*Pfunc)(void);//函数指针
    Pfunc = func1;
    Pfunc();等同于func1();

    typedef char * (pType)(char , const char *);
    pType p6;//等效于char * ( * p6)(char * , const char );这个函数的返回值是char *类型的。

  4. 函数、指针与数组

    函数指针数组
    typedef char * (* pType[5] )(char * , const char *);//数组里面存放的是函数指针
    函数指针数组指针

这里写代码片
typedef char * (*(*pType)[5])(char * , const char *);    //(*pType)[5]这一部分是函数指针,本身又是数组指针,所以是函数指针数组指针,数组指针里面存放的是函数指针

本博文只是作为自己的一个笔记(本笔记是跟着朱有鹏老师视频课所做的笔记总结),如果能帮助其他人更好,若有疑问欢迎指出,欢迎加QQ 1922546282,共同讨论与学习。

猜你喜欢

转载自blog.csdn.net/Allone2333/article/details/81258951