c语言 数组与指针的异同

数组和指针的区别

指针数组
保存数据的地址保存数据

间接访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。

如果指针有一个下标[i],就把指针的内容加上i作为地址,从中提取数据。

直接访问数据,a[i]只是简单的以a+i为地址取得数据。
通常用于动态数据结构通常用于存储固定数目且数据类型相同的元素。
相关的函数为malloc(),free()隐式分配和删除
通常指向匿名数据自身即为数据名

数组与指针不同的试验:

ext.c

int a[] = {1, 2, 3, 4, 5};

test.c

#include <stdio.h>

int main()
{
    extern int a[]; //首先使用数组进行试验
    
    printf("&a = %p\n", &a);  
    printf("a = %p\n", a);
    printf("*a = %d\n", *a);

    return 0;
}

运行结果(32位编译器下的运行结果

&a = 0x601040
a = 0x601040
*a = 1

*a是代表a地址上保存的第一个元素的值

&a值和a一样,但意义不同。

a表示数组第一个元素的地址,a+1就变成第二个元素地址(int 每个元素地址相隔4)

&a表示整个数组,&a+1就直接跳过整个数组的内回存地址空间(相当于跳过了 4*元素个数的地址)

 

下面我们将test.c修改为下面这样

#include <stdio.h>

int main()
{
    extern int* a; //使用指针形式进行引用
    
    printf("&a = %p\n", &a);  
    printf("a = %p\n", a);
    printf("*a = %d\n", *a);

    return 0;
}

运行结果(32位编译器下的运行结果

&a = 0x601040
a = 0x1
Segmentation fault (core dumped)

&a为指针a在内存中的地址值

a为指针对应内存地址上的值 0x1

*a为是取得0x1上保存的值,0x1为内存是受到保护的内存,去这个上面取数据时,就会出现段错误。

 

为什么会出现这种情况呢?其实在最开始的表格中就进行了说明。

指针和数组在访问数据上存在区别。 

数组:直接访问数据,a[i]只是简单的以a+i为地址取得数据。

指针:首先取得指针的内容,把它作为地址,然后从这个地址提取数据。

在上面的例子中,使用指针访问extern int a[]的元素时,指针对应的内容实际上是数组的值,然后指针使用数组的值去相应地址上找数据,结果就出现了段错误

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值