【C基础】深度剖析 指针数组、数组指针、函数指针、指针函数

【C基础】深度剖析 指针、数组、函数



  如何区分指针数组、数组指针、函数指针以及指针函数呢?
  其实很简单,就是看它的落脚点在哪,看它是数组还是指针还是函数

一、指针数组

  指针数组强调的是数组,保存指针的数组,每个元素的类型是指针
  实例: int* arr[3]
  解释: arr数组,该数组有3个元素,每个元素的类型是int*。


二、数组指针

  数组指针是指针,指向数组的指针,存放数组首元素的地址
  实例: int (*arr)[5]
  解释: arr先和*结合,说明arr是一个指针变量,然后指向的是一个大小为5的整型数组。所以arr是一个指针,指向一个有5个元素的整型数组。
  注意: []的优先级要高于*号的,所以必须加上()来保证arr先和*结合。(优先级()>[]>*)。

数组名是数组首元素的地址。(有两个例外)
[1] sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
[2] &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。


三、函数指针

  函数指针:是指针,指向函数的指针,存放这个函数的地址
  实例:****int (*pfun) (int, int)
  解释:pfun先与*结合是指针,指向一个返回值是整型并且有两个整形参数的函数。


四、指针函数

  指针函数:是函数,返回指针的函数
  实例: int* pfun(int, int)
  解释:pfun 是函数,是返回 int* 的指针函数。


五、C陷阱与缺陷

  在《C陷阱与缺陷》这本书中有两段这样的代码:

//代码1
(*(void (*)())0)();

在这里插入图片描述


//代码2
void (*signal(int,void(*)(int)))(int);

在这里插入图片描述


六、小试牛刀

6.1 用变量a给出下面的定义

  • 一个整型数。 int a;
  • 一个指向整数型的指针。 int* a;
  • 一个指向指针的指针,它指向的指针是指向一个整型数。 int** a;
  • 一个有10个整型数的数组。 int a[10];
  • 一个有10个指针的数组,每个指针是指向一个整型数的。 指针数组 int* a[10];
  • 一个指向有10个整型数的数组的指针。 数组指针 int (*a)[10];
  • 一个指向函数的指针,该指针有一个整型参数并返回一个整型数。 函数指针 int (*a)(int)
  • 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数。int (* a[10]) (int)

6.2 分析下面几个类型的定义

  • int(* func) (int *, int(*)(int*));
    分析:函数指针。定义了一个指针,该指针指向一个函数,该函数有两个参数,一个是整型指针,一个是函数指针(该指针指向的函数有一个整型指针的参数和整型的返回值)

  • int(*func[5])(int *);
    分析:函数指针数组。定义了一个数组,该数组有5个元素,每个元素的类型是函数指针(该指针指向的函数有一个整型指针的参数和整型的返回值)

  • int(*(*func)[5])(int *);
    分析:函数指针数组的指针。定义了一个数组指针,该数组有5个元素,每个元素是一个函数指针(该指针指向的函数有一个整型指针的参数和整型的返回值)

  • int(*(*func)(int *))[5];
    分析:数组函数的指针。定义了一个函数指针,该指针指向的函数有一个整型指针的参数和一个数组指针的返回值(该指针指向的数组有5个整型元素 )

  • int*(*func(int *))[5];
    分析:数组指针函数。定义了一个函数,该函数有一个整形指针的参数和一个数组指针的返回值(该指针指向的数组有5个整型指针元素)

  • int*(*(*func)(int *))[10];
    分析:数组指针函数的指针。定义了一个函数指针,该指针指向的函数有一个整型指针的参数和一个数组指针的返回值(该指针指向的数组有10个整型指针元素)

猜你喜欢

转载自blog.csdn.net/Sunnyside_/article/details/115219422