数组和指针的区别


 

首先对于编译器而言,一个数组是一个地址,一个指针是一个地址的地址。

 

 

数组要么在静态存储区被创建(如全局数组)

,要么在栈上被创建。数组名对应着(而

 

不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

 

 

例如:

 

 

void main(void) 

int a[10]; 

a ++;//error, a is left value,but can't be changed. 

 

指针可以随时指向任意类型的内存块

,

远比数组灵活,但也更危险。

 

下表是指针和数组一个

简单的比较

 

 

数组和指针的特点

 

数组

 

指针

 

 

保存数据

 

保存地址

 

 

直接访问数据

 

间接访问数据,先取得指针的内容,然后以它为地址,取得数据

 

 

 

用于存储数目固定且类型相同的数据

 

通常用于动态数据结构

 

 

由编译器自动分配和删除

 

动态的分配和删除,相关函数为

malloc() 

free() 

 

自身即为数据名

 

通常指向隐式数据

 

 

 

1

指针和数组都可以在初始化的时候赋予字符串常量。

尽管看上去一样,

底层机制却不同。

 

 

指针在定义的时候,

编译器并不会为指针所指向的对象分配内存空间,

它只是分配指针变量

的空间。

除非以一个字符串常量对其进行初始化。

下面的定义创建了一个字符串常量

(为其

分配了内存空间)

 

 

char *p = "abcd"; 

 

ANSI C

中,初始化指针时所指向的字符串被定义为只读,如果想通过指针修改字符串的

时候,会产生未定义的行为。

 

 

数组也可以用字符串常量进行初始化,但是其内容可以被修改。

 

 

2

、内容的复制和比较

 

 

不能对数组进行字节复制和比较,对于两个数组

a,b,

不能用

b=a

进行复制,而应当使用标准

库函数

strcpy()

。也不能使用

if(b==a)

进行比较,应当使用

strcmp()

 

 

而对于指针

p

如果要想将数组

a

中的内容复制,

要先申请一块内存区域,

然后使用

strcpy()

进行拷贝。

 

 

void main(void ) 

{ char a[] ="hello"; 

 

char b[10]; 

 

strcpy(b,a); // can't use b=a; 

 

if(strcmp(b,a) == 0);//can't use if(b==a) 

 

char *p = NULL; 

 

p = (char *)malloc(sizeof(char *)*(strlen(a)+1)

 

 

strcpy(p, a); 

 

if(strcmp(b,a) == 0); 

3

、计算内存容量

 

 

 

用运算符

sizeof()

可以计算出数组的容量(字节数)

。如下例

 

 

char a[] = "abcdef"; 

 

char *p = a; 

 

sizeof(a) = 7; 

 

 

sizeof(p) = 4;//sizeof(p) equal to sizeof(char *) =4 

 

注意当数组名作为函数参数进行传递时,该数组自动退化该类型的指针,如下例:

 

 

void TEST(char a[100]) 

 

cout<<sizeof(a)<<endl;// in this place, sizeof(a) is equal to sizeof(char *) = 4 

个人观点:

本来想再写一些关于指针和数组的相同之处,

但是我觉得对于二者讨论的太多反

而会让人更加模糊二者该如何使用,

陷入到理论的牛角尖中。

如果大家非要搞清楚的话,

以参考《

C

专家编程》

。只要我们可以正确的使用,就没有必要太深究吧,有时候钻的越深,

反而越不知如何使用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值