数组和指针的区别

 

参考:林锐博士,高质量C/C++编程指南

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

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而
不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

例如:

void  main( void )
{
int  a[ 10 ];
++ ; // 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   * =  NULL;
 p 
=  ( char   * )malloc( sizeof ( char   * ) * (strlen(a) + 1 );
 strcpy(p, a);
 
if (strcmp(b,a)  ==   0 );
}

3、计算内存容量

 用运算符sizeof()可以计算出数组的容量(字节数)。如下例

char  a[]  =   " abcdef " ;

char   * =  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专家编程》。只要我们可以正确的使用,就没有必要太深究吧,有时候钻的越深,反而越不知如何使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值