指针数组是什么:顾名思义,指针在前,数组在后即数组也,只不过里面所存放的内容皆是地址而已,数组不论几维,在计算机内存中都是呈线性排列的,所以指针数组是一个块保存地址的空间,数组的维度只在逻辑上的划分,在物理上并不存在.,
注意:本机环境32位操作系统,所以指针大小为4个字节
给个大小比较图:
代码:
int* arr[10] = { 0 };
int(*arry)[10] = { 0 };
printf("arr size:%d,arry size:%d", sizeof(arr), sizeof(arry));
运行结果
由此可以看出最直观的感受。指针数组是数组,数组指针是指针。
我们先来看一维的数组:
int arr[10]= { 0 };
printf("%p",arr);
这是程序运行的结果:它打印出了数组的首地址
当我们转到这个地址时,可以看到刚好有10个零
二维数组:
int arr[10][2]= { 0 };
printf("%p", arr);
二维数组的运行结果:
我们跳到这个地址,现在刚好有二十个连在一起的,刚好为零的地址,所以可以证明数组在C语言中只是逻辑上的划分,在物理层面还是一维的
好,让我们现在来定义一个指针数组看看:
int p1 = 20, p2 = 30;
int* arr[2] = { &p1,&p2 };
printf("arr address:%p,p1 address:%p,p2 address:%p", arr, &p1, &p2);
我们来看下的运行结果:
让我们来尝试跳转到这个数组的地址来看看:
可以看到它的里面存放的p1与p2的地址,好让我们跳转到这个指针的地址,来看看是否正确
可以看到指针数组就是保存各个指针的地址,然后按照首地址进入这个内存块,然后进行偏移操作,然后再读取这个地址,然后进行跳转;
我们这是假定是在32位操作系统中,指针的大小为4个字节
可以看到你如果用一个指针去指向这个数组的话,必须是两级及以上的指针才能读取内容,因为要读取两次内容,指针数组就介绍到这里,我们来看看数组指针
int arr[4] = { 1,2,3,4 };
int(*ptr)[4] = arr;
printf("arr address:%p,ptr address:%p", arr, &ptr);
我们先跳转到ptr的地址看看
看那个地址和数组的地址一样:
我们跳转到了数组的址空间
给出结构图:
好了,我向你们介绍的指针数组与数组指针就结束了!!
最后
因为本人水平有限,所以如有错误还望予以指正!!