數(shù)組空間的初始化就是為每一個(gè)標(biāo)簽地址賦值谎砾。按照標(biāo)簽逐一處理春瞬。如果我們需要為每一個(gè)內(nèi)存賦值惫确,假如有一個(gè)int a[100];我們就需要用下標(biāo)為100個(gè)int類(lèi)型的空間賦值山上。這樣的工作量是非常大的眼耀,我們就想到了讓編譯器做一些初始化操作,初始化操作是第一次賦值佩憾,第二次賦值就不能再這樣賦值了哮伟。
int a[10]=空間;
我需要給它一個(gè)空間妄帘,讓它對(duì)這里面的值進(jìn)行批量處理楞黄;比如int a[10]={10,20,30}; //a[1]=10,a[2]=20,a[3]=30,a[4]=…=a[9]=0所以實(shí)際上還是批量?jī)?nèi)存拷貝的結(jié)果,未賦值的結(jié)果就是0抡驼。初始化與我們逐一賦值的效率是一樣的鬼廓。批量拷貝僅限于第一次賦值。
注意:數(shù)組空間的初始化和變量的初始化本質(zhì)不同致盟,尤其在嵌入式的裸機(jī)開(kāi)發(fā)中碎税,空間的初始化往往需要庫(kù)函數(shù)的輔助。
char buf[10]={‘a(chǎn)’,’b’,’c’}; //c的字符串有一個(gè)重要的屬性馏锡,字符串結(jié)尾有一個(gè)字符’\0’代表字符串的結(jié)束雷蹂。因?yàn)槲覀冞@里為字符串空間定義了10個(gè)字符的大小,但是有時(shí)候我們并沒(méi)有使用完這10個(gè)字節(jié)杯道,打印的時(shí)候10個(gè)字節(jié)的打印也是錯(cuò)誤的匪煌,所以為了給字符串一個(gè)結(jié)束的標(biāo)志,讓其它的函數(shù)比如printf函數(shù)輸出的時(shí)候知道它的結(jié)尾党巾。
char buf[]=”abc”; //省略數(shù)組大小萎庭,C會(huì)為數(shù)組指定大小,這里就是三個(gè)字符加上一個(gè)結(jié)尾標(biāo)志齿拂,數(shù)組大小就是4
char buf[10]={“abc”};
char buf[10]=“abc”; //將三個(gè)字符批量拷貝到它分配的空間擎椰,末尾加’\0’
char *p=“abc”; //先給三個(gè)字符分配空間,再將指針指向字符串的首地址创肥,這指向的是一個(gè)常量字符串达舒。
buf[2]=’e’; //這是可以的
p[2]= ’e’; //這是不可以的,p指向的是常量區(qū)
測(cè)試代碼如下
我們將這個(gè)字符串作為printf函數(shù)的參數(shù)叹侄,它返回的實(shí)際上是常量字符串的首地址巩搏,而我們這里將它作為一個(gè)整型來(lái)打印,有一個(gè)警告趾代,應(yīng)該把它作為無(wú)符號(hào)整型(內(nèi)存地址是正整型的)來(lái)打印贯底。
運(yùn)行結(jié)果如下
可以看到的確打印了一個(gè)地址,說(shuō)明雙引號(hào)返回的的確是一個(gè)地址,正好和我們前面介紹的字符數(shù)組獲取到它的首地址禽捆,然后依次拷貝笙什,但是字符指針就直接得到它的地址存儲(chǔ)。這些不同的操作就是數(shù)據(jù)類(lèi)型具體的操作了胚想。
原文鏈接:http://www.maiziedu.com/wiki/c/space/