易混淆指针概念(C语言)

212 阅读1分钟

第一组

1、int *a[10]

这是个指针数组,数组a中有10个整型的指针变量。因为它是个数组,则它占40个字节

2、int (*a)[10]

数组指针变量,它是个指针变量。占4个字节,存地址编号。它指向一个数组,它加1的话,指向下一个数组。

3、int **p

这是个指针的指针,保存指针变量的地址,经常用来保存指针的地址。
常见用法1
    int **p;
    int *q;
    p = &q;
 常见用法2
     int **p;
     int *q[10];
     分析:q为指针数组的名字,是指针数组的首地址,是q[0]的地址,q[0]是个int *类型的指针。
     所以q[0]指针变量的地址是int **类型的。p=&q[0];等价于p=q;
     

示例代码:

#include <stdio.h>

void fun(char **p) {
    for(int i = 0; i < 3; i++) {
        printf("%s\n",p[i]); // *(p+i)
    }
}

int main() {
    char *q[3] = {"hello", "world", "China"};
    fun(q);
    return 0;
}

第二组

1、int *f(void)

注意:*f没有用括弧括起来
它是个函数的声明,声明的这个函数返回值为int *类型的。

2、int (*f)(void)

注意:*f用括弧括起来了,*修饰f,说明f是个指针变量。
f是个函数指针变量,存放函数的地址,它指向的函数必须有一个int类型的返回值,没有参数。