指针的一些复杂声明

简介: 指针的一些复杂声明

列举了一些比较棘手的声明:

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和指针》。


如果有错误请写在评论区或者私信我,我及时改正。

完!


目录
相关文章
|
3天前
|
存储 安全 C语言
引用指针
引用指针
16 1
|
3天前
|
存储 安全 C++
在C++指针和引用
在C++指针和引用
|
3天前
|
存储 程序员 C++
C++的指针和引用
C++的指针和引用
|
3天前
|
存储 安全 C++
深入理解C++中的指针与引用
深入理解C++中的指针与引用
11 0
|
3天前
|
C++
C++指针与引用
C++指针与引用
11 0
|
3天前
|
安全 C++
C++中的引用与指针
C++中的引用与指针
25 0
|
9月前
|
编译器 C++ 容器
C++中的类、结构体、指针和引用
在介绍类和对象之前,我们先来简单了解一下面向过程和面向对象的概念。 面向过程是指程序的设计者关注于问题的解决过程,通过将问题分解为多个步骤和函数,并将这些步骤按照顺序组合起来实现程序的功能。这种方法的优点是结构清晰、容易理解和调试。但是随着程序的规模增大,面向过程的程序会变得越来越复杂,难以维护和扩展。 而面向对象则是一种更高级别的程序设计方式,它强调将数据和对数据的操作封装起来,形成一个对象。对象既包含数据又包含操作数据的方法,可以直接对外提供服务。这种方法具有高度的灵活性、可重用性和扩展性,易于维护和修改。
155 0
|
10月前
|
编译器
|
11月前
|
存储 C++
【为什么】引用和指针
【为什么】引用和指针
|
安全 C++
【C++】引用与指针
【C++】引用与指针