数组指针和指针数组

#include <stdio.h>
#include <stdlib.h>
int main() {
    int a[] = { 1, 2, 3, 4 };  // 定义一个数组
    printf("%p\n", a);  // 直接取到数组名,则隐式转换成指针,指向数组首元素
    printf("%p\n", &a);  // 还是一个指向数组首元素的指针
    system("pause");
    return 0;
}

虽然说两个运算得到的内容相同,但是不代表两个指针是同一个指针。因为指针不光要知道它指向那个位置,还要知道指向的位置有多大。接下来我们对两个指针进行加减整数操作,就可以知道这两个指针到底是不是等价的。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int a[] = { 1, 2, 3, 4 };  
    printf("%p\n", a);  // 得到的是数组首元素的地址
    printf("%p\n", a + 1);  // 跳过了一个 int 元素,和第一个相差了4个字节
    printf("%p\n", &a + 1);   // 跳过整个数组,和第一个相差了16个字节
    system("pause");
    return 0;
}

我们可以看到 a 这个数组里面有四个元素,每个元素又是个 int 类型,即每个元素占据4个字节,所以整个数组就占据16(4*4)个字节。题目中的 a 是指向了 int,而 &a 则指向了 int数组,因此我们把 &a 这种形式的指针成为“数组指针”,指向了整个数组。


#include <stdio.h>
#include <stdlib.h>
int main() {
    int* a = { 0 };  // 创建了只有一个元素的数组(大括号里面有几个元素,数组长度就是多少)
}

我们可以看到上述操作是创建了一个元素个数只有一个的数组,而且可以看到这是个元素值为NULL的“空指针”。


那么,数组指针的本质是指针,只不过它指向了整个数组,跟整数进行算术运算的时候是会跳过整个数组元素;而指针数组本质则是数组,只不过它里面的每个元素都是一个指针。这样一来,这两个概念很容易就搞清楚了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值