数组和指针的区别
| 指针 | 数组 |
| 保存数据的地址 | 保存数据 |
|
间接访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。 如果指针有一个下标[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[]的元素时,指针对应的内容实际上是数组的值,然后指针使用数组的值去相应地址上找数据,结果就出现了段错误。
5294

被折叠的 条评论
为什么被折叠?



