列举了一些比较棘手的声明:
int f; f是一个整型变量。
int *f; f是一个指向整型的指针。
int* f,g; f是一个指向整型的指针。g是一个整型变量
int f(); f是一个函数。参数为void,返回类型为int
int *f(); f是一个函数。参数为void,返回类型为指向整型的指针
int (*f)(); f是一个函数指针。该指针指向一个函数,该函数参数为void,返回类型为int
int *(*f)(); f是一个函数指针。该指针指向一个函数,该函数参数void,返回值为指向整型的指针
int f[]; f是一个数组。数组存放的元素类型为整型
int *f[]; f是一个数组。数组存放的元素类型为指针,该指针指向整型
int f()[]; f是一个函数。参数是void,还剩下int [] , 返回类型为整型数组。函数只能返回标量值,不能返回数组。该声明非法
int f[](); f是一个数组。还剩下int () ,数组存放的元素类型为函数,该函数参数void,返回值为整型。数组元素必须具有相同的长度,但不同的函数可能具有不同的长度。该声明非法
int (*f[])(); f是一个指针数组。该数组中存放的元素类型为函数指针,该函数参数void,返回类型为整型
int *(*f[])(); f是一个指针数组。该数组中存放的元素类型为函数指针,该函数参数void,返回类型为指向整型的指针
int (*f)(int, float); f是一个函数指针。该指针指向一个函数,该函数参数1为整型,参数2为浮点型,返回类型为整型
int *(*g[])(int, float); g是一个函数指针。该指针指向一个函数,该函数参数1为整型,参数2为浮点型,返回类型为指向整型的指针
int abc(); abd是一个函数。参数为void,返回类型int
int abc[3]; abc是一个数组,数组存放的元素类型为整型
int **abc(); abc是一个函数。参数为void,返回类型是指向整型的指针的指针
int (*abc)(); abc是一个函数指针。该指针指向一个函数,该函数参数void,返回类型为整型
int (*abc)[6]; abc是一个数组指针。该指针指向一个数组,该数组存放的元素类型为整型
int *abc(); abc是一个函数。参数void,返回类型为指向整型的指针
int **(* abc[6] ) (); abc是一个指针数组。该数组存放的元素类型是一个函数指针。该指针指向一个函数,该函数的参数为void,返回类型为指向整型的指针的指针。
int **abc[6]; abc是一个数组。数组存放的元素类型是指向整型的指针的指针
int *(*abc)[6]; abc是一个数组指针。该指针指向一个数组,该数组存放的元素类型为指向整型的指针
int *(*abc() ) (); abc是一个函数,参数void,返回类型为函数指针,该指针指向一个函数,该函数的参数void,返回类型为整型
int (** (* abc() ) (); abc是一个函数,参数void,返回类型为函数指针,该指针指向一个函数,该函数参数void,返回类型为指向整型的指针的指针。
int (*(*abc) () )[6];
abc是一个函数指针。该指针指向一个函数,该函数的参数为void,返回类型是一个指针数组,该数组存放的元素类型是指向整型的指针
int *( * (* (* abc) ( ) )[6]) ();
abc是一个函数指针。参数为void,返回类型为函数指针,该指针指向一个函数,参数void,该函数返回值为数组指针,该数组存放的元素类型为整型。
(*(void (*)())0)();
上面这个我们分析一下,
void (*)()这是一个函数指针,该指针指向一个函数,该函数参数void,返回类型void
还剩下(*( )0)(); * 是对上面指针的解引用,
还剩下0(); 这是函数的调用。
总的分析:将0强制转换成一个函数指针类型然后对该指针进行解引用,然后调用该函数。
这个语句的目的是硬件将调用首地址为0位置的子进程。
void (*signal (int, void(*)(int))) (int);
分析该语句:
void(*)(int)这是一个函数指针,该指针指向一个函数,该函数参数整型,返回类型void
signal(int, void(*)(int))这是一个函数,该函数参数1为整型,参数2为一个函数指针。
还剩下void * (int) 这是一个函数指针,参数为整型,返回类型为void
总的分析:singal一个函数声明。第一个参数为整型,第二个参数是一个函数指针,该指针指向一个函数,该函数参数整型,返回类型void。返回类型是一个函数指针,该指针指向一个函数,该函数参数为整型,返回类型为void。
字符串常量
"xyz" + 1 字符串常量本质是指针常量,所以+1就指向y元素的指针
"*xyz" 指针指向字符串第一个字符,所以解引用就是x
"xyz"[2]相当于“xyz” + 2指针向后偏移俩个单位,但后解引用。就是z
*("xyz" + 4)越界了
上面的题目来自《C陷阱与缺陷》和《C和指针》。
如果有错误请写在评论区或者私信我,我及时改正。
完!