C语言高级指针:指针数组、数组指针、函数指针、函数指针数组、函数指针数组的指针...

  1. int *p[10];
    指针数组:是数组,是一个存放指针的数组
    这里的p是一个数组名,这个数组里面有10个元素,每个元素的类型都是int *类型
  2. int (*p)[10];
    数组指针:是指针,这个指针指向一个数组
    这里的p是一个指针变量,它指向一个有10个int类型元素的数组

    为什么1式就是一个数组, 而2式是一个指针变量呢?
    这是因为“[]”的优先级比“*”要高,在1式中“p”先和“[]”结合成数组,在2式中“()”改变了优先级,使得“p”先和“*”结合,那么此时的p是一个指针变量

  3. void (*p)();
    函数指针:是指针,指针指向的是一个函数
    下来看一下两段有趣的代码:
    (1)(*(void (*)())0)();

    void(*)(),可以明白这是一个函数指针类型,这个函数没有参数,没有返回值。
    (void(*)())0,将0强制转换为函数指针类型,0是一个地址,也就是说一个函数存在首地址为0的一段区域内
    (*(void(*)())0),这是取0地址开始的一段内存里面的内容,其内容就是保存在首地址为0的一段区域内的函数
    (*(void (*)())0)(),这就是函数调用
    

    (2)void (*signal(int, void(*)(int)))(int)
    signal首先和()结合成一个函数,这个函数有两个参数,一个是int,一个是void(*)(int),它的返回值也是一个函数指针类型,即void(*)(int)

  4. int (*arr[10])();
    函数指针数组: arr首先和[]结合,说明arr是一个数组,数组的内容是什么呢?是int (*)()类型的函数指针
  5. int (*(*p)[10])();
    函数指针数组指针: 这里的p首先和*结合,表示p是一个指针变量,那么把*去掉,看还剩下什么?int (*p[10])(),发现这就是一个函数指针数组,所以int (*(*p)[10])()是一个指向函数指针数组的指针,即函数指针数组指针

你可能感兴趣的:(C语言高级指针:指针数组、数组指针、函数指针、函数指针数组、函数指针数组的指针...)