数组和指针的比较和关系以及区别

1.指针和数组的内存布局

我最近在网上看到好多人都在说数组就是指针,但是我可不这样认为,我觉得数组就是数组,指针就是指针。它两个可能有关系,但是呢他两个之间一定不会划上等号。

首先从下面这些点谈谈


==》指针的内存布局

 举个例子 *p


任何数据都将被当作地址来处理。

我们可以简单的这么理解:一个基本的数我们把p 称为指针变量 ,p 里存储的内存地址处的内存称为 p 所指向的内存。指针变量p里存储的据类型(包括结构体等自定义类型)加上“*号就构成了一个指针类型的模子。这个模子的大小是一定的,与“*”号前面的数据类型无关。“*”号前面的数据类型只是说明指针所指向的内存里存储的数据类型。所以,在32系统下,不管什么样的指针类型,其大小都为4byte


==》数组的内存布局


int a[5]



2.指针和数组的定义与声明

什么是声明和定义:
C语言中的对象必须只有一个定义,但是它可以有多个extern声明。
定义是一种特殊的声明,它创建对象;
申明简单地说明了在其他地方创建的名字,它允许你使用这个名字。

区分定义和声明:
只要记住下面的内容即可:

1.声明相当于普通的声明:它所声明并非自身,而是描述其他地方创建的对象。
2.定义相当于特殊的声明:它为对象分配内存。
==》定义为数组,声明为指针
文件1中定义如下:
char a[100];
文件2中声明如下:
externchar *a;
定义分配的内存,而声明没有。
定义只能出现一次,而声明可以出现多次。这里extern 告诉编译器a 这个名字已经在别的文件中被定义了,下面的代码使用的名字 a 是别的文件定义的。

这就是为什么extern char a[]与 extern char a[100]等价的原因。因为这只是声明,不分配空间,
所以编译器无需知道这个数组有多少个元素。这两个声明都告诉编译器a 是在别的文件中被定义的一个数组,
a 同时代表着数组a 的首元素的首地址,也就是这块内存的起始地址。数组内地任何元素的的地址都只需要知道这个地址就可以计算出来。

但是,当你声明为extern char *a 时,编译器理所当然的认为a 是一个指针变量,在 32位系统下,占4个byte 。这4个byte 里保存了一个地址,这个地址上存的是字符类型数据。虽然在文件1 中,编译器知道 a 是一个数组,但是在文件 2 中,编译器并不知道这点。大多数编译器是按文件分别编译的,编译器只按照本文件中声明的类型来处理。所以,虽然a 实际大小为100个byte ,但是在文件2 中,编译器认为a 只占4 个byte 。

我们说过,编译器会把存在指针变量中的任何数据当作地址来处理。所以,如果需要
访问这些字符类型数据,我们必须先从指针变量a 中取出其保存的地址。如下图

==》定义为指针,声明为数组
文件1
char *p = “abcdefg”;
文件2
externchar p[];

在文件1 中,编译器分配4 个byte 空间,并命名为p。同时p 里保存了字符串常量“abcdefg”的首字符的 首地址。这个字符串常量本身保存在内存的静态区,其内容不可更改。在文件2中,编译器认为p 是一个数组,其大小为 4 个byte ,数组内保存的是char 类型的数据。
在文件2 中使用p 的过程如下图:

3.数组和指针的对比


声明一个数组的时候同时也分配了一些内存空间用来容纳元素,而指针只分配了用于存储指针的空间.

其实这些资料有些图,都是我在C和指针这本书上找到的,不过呢总结出来,就是想让大家以及我自己能把他们区分清楚。  数组和指针有联系,他们不是一回事。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值