C语言指针数组与数组指针

 

指针数组是什么:顾名思义,指针在前,数组在后即数组也,只不过里面所存放的内容皆是地址而已,数组不论几维,在计算机内存中都是呈线性排列的,所以指针数组是一个块保存地址的空间,数组的维度只在逻辑上的划分,在物理上并不存在.,

注意:本机环境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的地址看看

看那个地址和数组的地址一样:

我们跳转到了数组的址空间

给出结构图:

好了,我向你们介绍的指针数组与数组指针就结束了!!

最后

因为本人水平有限,所以如有错误还望予以指正!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值