char *p = “hello”;
上邊的表達(dá)式為什么可以,而把p換成數(shù)組,然后再賦值就不行了
解釋:
字符串常量”hello”出現(xiàn)在一個(gè)表達(dá)式中時(shí),表達(dá)式使用的值就是這些字符所存儲(chǔ)的地址,而不是這些字符本身。
所以,可以把字符串賦值給指向字符的指針p,而不能把字符串賦值給一個(gè)字符數(shù)組。
char a[10] = “hello”; //這樣可以,這種情況是c語(yǔ)言初始化所支持的
如果寫(xiě)成char a[10]
然后 a = “hello” 這樣就錯(cuò)誤了。
同樣是a數(shù)組,char a[10] = “hello”;這種是數(shù)組的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一個(gè)道理
但是換成char a [10]
然后a = “hello”就不行了 “hello”賦值的值是一個(gè)地址,而a雖然也有地址,但是這與指針是不一樣的,指針的值是地址,而數(shù)組的值不是地址。
代碼測(cè)試
#include <stdio.h>
int main()
{
char *p = "hello";
printf("%s",p);
char a[10];
a = "hello";
return 0;
}
error C2440: '=' : cannot convert from 'char [6]' to 'char [10]'
There is no context in which this conversion is possible
看到這樣的錯(cuò)誤提示,你是否會(huì)想到把char a[10]改成char a[6]呢
試一下,
error C2106: '=' : left operand must be l-value
這就和上邊的分析同樣的道理了,右邊的是一個(gè)地址,而左邊的是一個(gè)值
繼續(xù)擴(kuò)展問(wèn)題:
在使用指針的時(shí)候,指針可以自增,而數(shù)組不能自增
是因?yàn)閍是個(gè)常量,也就是說(shuō)在聲明一個(gè)指針時(shí),編譯器只給指針本身保留內(nèi)存空間,而沒(méi)有為指針?lè)峙鋬?nèi)存空間。而數(shù)組就不同了,編譯器給數(shù)組分配了空間,數(shù)組a的地址就是一個(gè)常量了,讓常量自增這肯定是不行的
繼續(xù)擴(kuò)展:
在指針自增的時(shí)候,編譯器會(huì)自動(dòng)識(shí)別類型,比如指針是指向int型的,想獲取下一個(gè)的地址時(shí),指針直接p++就行了,不要多此一舉的p+4了
特別需要注意的是,在void指針使用的時(shí)候,不能使用指針運(yùn)算,應(yīng)為void型編譯器不能識(shí)別類型的長(zhǎng)度(即指針?biāo)笇?duì)象的體積),p++這樣就是不合法的,即不能進(jìn)行數(shù)學(xué)運(yùn)算,也不能使用*取值操作,想使用必須轉(zhuǎn)換為其它的類型
聯(lián)系客服