數組空間的初始化就是為每一個標簽地址賦值。按照標簽逐一處理。如果我們需要為每一個內存賦值,假如有一個int a[100];我們就需要用下標為100個int類型的空間賦值。這樣的工作量是非常大的,我們就想到了讓編譯器做一些初始化操作,初始化操作是第一次賦值,第二次賦值就不能再這樣賦值了。
int a[10]=空間;
我需要給它一個空間,讓它對這里面的值進行批量處理;比如int a[10]={10,20,30}; //a[1]=10,a[2]=20,a[3]=30,a[4]=…=a[9]=0所以實際上還是批量內存拷貝的結果,未賦值的結果就是0。初始化與我們逐一賦值的效率是一樣的。批量拷貝僅限於第一次賦值。
注意:數組空間的初始化和變量的初始化本質不同,尤其在嵌入式的裸機開發中,空間的初始化往往需要庫函數的輔助。
char buf[10]={‘a’,’b’,’c’}; //c的字符串有一個重要的屬性,字符串結尾有一個字符’\0’代表字符串的結束。因為我們這里為字符串空間定義了10個字符的大小,但是有時候我們並沒有使用完這10個字節,打印的時候10個字節的打印也是錯誤的,所以為了給字符串一個結束的標志,讓其它的函數比如printf函數輸出的時候知道它的結尾。
char buf[]=”abc”; //省略數組大小,C會為數組指定大小,這里就是三個字符加上一個結尾標志,數組大小就是4
char buf[10]={“abc”};
char buf[10]=“abc”; //將三個字符批量拷貝到它分配的空間,末尾加’\0’
char *p=“abc”; //先給三個字符分配空間,再將指針指向字符串的首地址,這指向的是一個常量字符串。
buf[2]=’e’; //這是可以的
p[2]= ’e’; //這是不可以的,p指向的是常量區
測試代碼如下
我們將這個字符串作為printf函數的參數,它返回的實際上是常量字符串的首地址,而我們這里將它作為一個整型來打印,有一個警告,應該把它作為無符號整型(內存地址是正整型的)來打印。

運行結果如下
可以看到的確打印了一個地址,說明雙引號返回的的確是一個地址,正好和我們前面介紹的字符數組獲取到它的首地址,然后依次拷貝,但是字符指針就直接得到它的地址存儲。這些不同的操作就是數據類型具體的操作了。

原文鏈接:http://www.maiziedu.com/wiki/c/space/
