C语言之指针和数组的深度理解

一、数组名表示整个数组时的情况:1.sizeof函数计算大小时,sizeof(数组名),这时数组名表示整个数组,如果括号中有其他的东西那么括号中表示的是数组首元素的地址。

2.&数组名,这时数组名表示整个数组。

二、数组和指针

指针数组:指针数组是一个存放指针的数组。本质是数组。

指针数组的创建过程如下:int *arr1[10]

char *arr2[4]

数组指针:数组指针是指向数组的指针。本质是指针。

数组指针的创建过程如下:int (*p)[10] p先与*结合,p为指针变量,然后指向的是一个大小为10的数组。p是一个指向一个整形数组的指针,所以为数组指针。

指针数组和数组指针的关系:数组指针是指首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动);指针数组是数组元素为指针的数组,其本质为数组。


三、二维数组指针、指针数组和二维数组的对比

#include<stdio.h>
int main
{
int a[3][4];
int (*p)[4]=a;
}

a为一个二维数组的数组名,相当于一个二级指针。

p是一个指针变量指向包含4个整形元素的一维数组。

char a[2][10] = {"HELLO","WORLD"};

char *a[2]= {"HELLO","WORLD"};

他们在系统内存的存储方式分别如图所示:



由此可见,数组在创建时系统就分配了固定的空间供使用,而指针数组系统分配的空间取决于字符串所需要的空间大小。

四、函数指针

通过前面的学习我们了解到,个每个函数在创建时系统会分配给函数一个固定的地址,我们在使用这个地址时可以通过&函数名来获得函数的地址。

举个例子:

void test()
{
printf("hello\n");
}
void(*pfun)();
这里的pfun必须先和*结合说明它是一个指针,在和函数操作符()结合说明它是一个指针函数。pfun前面的void表示所指向函数的返回类型,函数操作符()中的参数表示所指向函数的参数。 












猜你喜欢

转载自blog.csdn.net/CHR_1s/article/details/80156803
今日推荐