数组、指针、函数之间的关系

数组

int a[5];

定义了一个数组,其中包含了5个int类型数据,我们可以用a[0],a[1],a[2]…等访问这些元素
sizeof(a)为整个元素大小,为20。
sizeof(a[0])是第一个元素的大小,为4。
sizeof(a[5]),值为4。在这里没有出错是因为sizeof是关键字,只是访问这个值的大小,并不会去执行。
sizeof(&a[0])值为4,因为取出首元素地址,地址大小都为4个字节。+1会跳过一个元素。
sizeof(&a)值为4,整个数组的地址,地址大小为4个字节。+1会跳过整个数组。

指针

int *p

定义一个指针变量p,大小为4个字节。这个变量p指向对应的一块物理内存。
*p将得到对应物理内存内的数据。

数组与指针

数组与指针之间并没有任何的关系。只不过他们可以用彼此的方法来访问各自对应的数据。千万不要把他们当做等价的。
比如:

char *p = "abcdef";
char a[] = "123456";

我们可以用指针的形式访问数组a的内容:
*(a+4):这样就访问到数组a中的数字“5”;
也可以用数组的形式访问指针所指向字符串的内容:
p[4]:这样就访问到指针p所指向字符串中的“e”;

指针数组

指针数组:首先他是一个数组,数组的元素都是指针。可以这样理解”好孩子”指的关键字是”孩子”,”孩子好”的关键字是”好”。

int * p1[10];//指针数组

数组名为p1[10];
去掉数组名p1[10]就是类型,int *就是每个元素的类型。

数组指针

数组指针:是一个指针,它指向一个数组。指向数组的首地址。

int (*p2)[10];//数组指针

注意[]的优先级高于*:p2将先于[]结合,所以我们应该将*p2用括号括起来让他们先结合。这样才是数组指针。

函数指针

函数指针,顾名思义,就是函数的指针。他是一个指针,指向一个函数。

int (*fun1)(int x, int y);

fun1是一个指针变量,指向一个函数,这个函数有两个整型的参数,返回值也是一个整型。
那么我们怎样使用它呢:
将其解引用,然后再传对应的参数:(*fun)(1,2);
其实这里fun前面的“*”多写几个也不会出错。
甚至于不写“*”也是可以的。
因为fun前面的*只是个摆设,但是写上会增加代码的易读性与美观性,所以我们还是将其加上比较好。

函数指针数组

举个例子

char *(*pf[3])(char *p);

顶一个韩函数指针数组,他是一个数组,数组名为pf,里面存储了三个指向函数的指针,这些指针只想一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。这是一个指针数组,是数组。

指向函数指针数组的指针

这是一个指针,指向一个数组,这个数组里面存储的都是指向函数的指针。比如:

int (*(*pf)[3](int);

在这里pf是一个指针,这个指针指向了一个数组,这个数组包含了三个元素,每个元素都是指向函数的指针,这些指针指向一些返回类型为整型,参数为整型。

猜你喜欢

转载自blog.csdn.net/qq_41804778/article/details/80200555
今日推荐