您的位置:首页 > 编程语言 > C语言/C++

数组和指针的区别

2013-11-16 11:44 344 查看
 
首先对于编译器而言,一个数组是一个地址,一个指针是一个地址的地址。
 
 
数组要么在静态存储区被创建(如全局数组)
,要么在栈上被创建。数组名对应着(而
 
不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
 
 
例如:
 
 
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
专家编程》
。只要我们可以正确的使用,就没有必要太深究吧,有时候钻的越深,
反而越不知如何使用。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 指针 数组