C语言---“定义为数组而声明为指针,定义为指针而声明为数组” c语言声明指针

假设有两个c文件:

file1.cpp

extern char a[];

C语言---“定义为数组而声明为指针,定义为指针而声明为数组” c语言声明指针

extern char *b;

file2.cpp

char *a;

char b[100];

第一种情况:定义为指针,声明为数组

编译错误。对于声明和定义,并不像简单的赋值语句,如”chara[];char *p=a;”,这样指针保存的是数组a的第一个元素,即数组首元素的首地址赋值给了p,这是符合逻辑的一种赋值方法。但是对于声明和定义,声明为a[]时,a表示的是一个常量,即数组首地址,寻址方式为(a+i),但是在文件2中定义的是一个指针*a,这里a表示的是数组首元素的地址(假设值为0x12345678),寻址方式是先获取数组首地址,然后加上偏移量。而此时却以数组的寻址方式代替指针访问方式,结果是a[0]=0x12,a[1]=0x34, a[2]=0x56, a[3]=0x78,即本来表示为地址的值被认为了数组元素。后面的结果可能导致访问其他内存,造成未定义错误。

第二种情况:定义为数组,声明为指针

编译错误。与第一种情况类似,文件2中b是数组首地址常量(假设数组元素分别为:0x12,0x34,0x56,0x78,0x90),而文件1中声明的是指针,所以按照指针的寻址方式读取数据,即先获取数组首地址,char*b=0x12345678,这样本来是数组元素的值被当成了指针,如果该指针指向了某个有效数据,那么对指针的操作可能导致未定义的错误。

总结:之所以发生这样的错误,根本原因是数组和指针的访问方式的区别。数组访问是直接寻址,指针访问是间接寻址。

  

爱华网本文地址 » http://www.413yy.cn/a/25101015/241756.html

更多阅读

百货连锁之王柏泰恩

  无论是哪一个时代,所谓流行莫不是年轻一代的爱好,也由于他们的尝试、创造、推广,然后成为一时风尚。商品只要适合年轻男女的口味,在受欢迎之余,便可能有爆炸性的畅销,成为所谓流行的商品。   就某种意义来说,商品推销的关键,把握在年

挑战者号:选准发射路线

  在一个细分化的市场中,每个企业因营销目的、资源和实力的不同而具有不同的竞争地位。西方营销学家因此把它们分为市场主导者、市场挑战者、市场跟随者和市场补制者四个层次。挑战者虽然没有主导者那样雄厚的经营实力和巨大的市

营销战例评说

多角经营·“拍立得”避免立即消失·李秉哲三头六臂称霸韩国  企业多方面谋求发展的最主要原因,就是避免把所有的鸡蛋放入一个篮子里。谨慎的企业规划者在制定多角化发展路线时,会极力避免企业因某一产品的崩溃而元气大伤,有一定收

坎多尔弗走向峰颠

  没有小的成功,就不会有大的成功。   不善于从小的成功中培养自信心,也不会有大的成功。   乔·坎多尔弗,保险业推销员,世界第一号代理商,他曾连续10年每年的推销额没少过8亿美元,1976年,他的推销额创纪录地达到10亿美元。在美国

联奖销售的启示

  有奖销售犹如“鸡肋”,众人已兴趣索然.联奖销售的启示在于:消费者究竟想要什么?   我们以前接触到的有奖销售,基本可分为两种类型。其一是在所售商品中随机抽取若干件,对其买主加以奖励。这种方式优点不言自明,可时间一长人们

声明:《C语言---“定义为数组而声明为指针,定义为指针而声明为数组” c语言声明指针》为网友半裸狂热者分享!如侵犯到您的合法权益请联系我们删除