C语言细节

一些常见细节

  • int *p[]int (*p)[] 的区别

    int *p[4];   //定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义了。
    int (*p)[4]; //定义一个数组指针,该指针指向含4个元素的一维数组(数组中每个元素是int型)。
    
    // 区分int *p[n]; 和int (*p)[n]; 就要看运算符的优先级了。
    int *p[n];   // 这里,运算符[ ]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组。
    int (*p)[n]; // 这里,( )优先级高,首先说明p是一个指针,指向一个整型的一维数组。
    总结下来就是,越是接近标识符就越说明标识符的性质,看标识符先和哪个结合
    • int *p[ ] 中 p最先和[]结合,所以p是一个数组,至于是什么数组,则要看其他修饰符。下一个和p结合的是指针,说明p数组里面存放的是指针,至于是什么指针,再看int,数组里面的指针指向的是int型的整数。
    • *(*p)[ ] 中, p 最先和*结合,已经奠定了p是一个指针的基础了,至于该指针指向的是什么东西,就要由外层修饰符来决定,外层中首先和p结合的是[ ],这说明了指针p指向的是一个数组,至于该数组存放的是什么样的值,还需要继续向外解析,解析出int才知道,该指针指向一个数组,该数组存放的是int型的整数。
    • int (*p)() 同理,p先和*结合奠定了p是一个指针的基础,往解析得到(),说明该指针指向的是一个函数,该函数参数为空返回值int
    • int (*p[])() p最先和[]结合,说明这是一个数组,然后和*说明数组存放的是指针,()说明该指针指向的是函数,该函数参数为空,返回值int
    • 另外 int (*p)[]() 本意是想p是一个指针,指向一个一个数组,数组存放函数指针。但是没编译器解析出来的是数组存放函数,数组不能存放函数,所以这是不对的,在结合()代表函数之前需要先指明数组存放的是指针,所以应该写成如下:
    • int (*(*p)[])() p是一个指针,指向一个数组,该数组存放的是函数指针,该函数参数为空,返回int。

相关推荐