軟考程序員輔導(dǎo):c語(yǔ)言數(shù)組注意問(wèn)題
int a[10];
數(shù)組名是常量不能為左值(如:a = 5;)
不要認(rèn)為數(shù)組元素a[i]代表數(shù)組元素的值,它代表數(shù)組元素本身,可作為左值使用。
為指針進(jìn)行初始化的字符串是只讀的
。ㄈ纾篶har *p = “hello”; strcpy(p, “world”);這樣寫是錯(cuò)的)
為數(shù)組進(jìn)行初始化的字符串是可寫的
。ㄈ纾篶har str[10] = “hello”;strcpy(str, “world”);這樣寫是對(duì)的)
注意:
一直以為a代表數(shù)組的首地址,可以像指針一樣進(jìn)行a++等操作,但是,數(shù)組名代表數(shù)組首地址,一定是個(gè)常量!
所以不能對(duì)數(shù)組名進(jìn)行 a++ 或者是 a-- 的操作,因?yàn)槌A坎荒鼙恍薷摹?br />
但如果定義指向數(shù)組的指針 *p=a;
那么這個(gè)指向該數(shù)組的指針是可以進(jìn)行 p++ 或者是 p-- 操作的,指針可以通過(guò)這種方式來(lái)獲取元素。
數(shù)組名 a 除了代表數(shù)組的首地址外,它還代表特定的類型,在此例中 a 代表了int[10] 這個(gè)類型。
在編譯環(huán)境內(nèi)運(yùn)行 prinrf(“%d %d)”,sizeof(a),sizeof(p)); 得到了40 4 。
得到這個(gè)結(jié)果的原因就是數(shù)組名 a 代表了它所定義的數(shù)組類型int[10],此類型占了10個(gè)int型大小的內(nèi)存,因此是長(zhǎng)度是40。
而指針存放的就是某個(gè)地址值,不論它指向的是什么類型的地址,都占有固定的4個(gè)字節(jié)大小。
直接訪問(wèn) —— 用變量名訪問(wèn)。
間接訪問(wèn) —— 用地址、指針訪問(wèn)。
間接訪問(wèn): *(首地址 + 偏移) 偏移=下標(biāo)值 * sizeof(數(shù)組元素類型)
? 通過(guò)數(shù)組下標(biāo)訪問(wèn)數(shù)組元素也是間接訪問(wèn)。
a[ i ] <==> *(a + i* sizeof(數(shù)組元素類型)) (每次偏移一個(gè)數(shù)組元素類型大小的字節(jié)數(shù))
查看動(dòng)態(tài)數(shù)組的大。
(注意頭文件:#include
int *p = (int *)malloc(sizeof(int)*10);
printf(“%d ”,_msize(p)) ;
輸出結(jié)果是40。
訪問(wèn)靜態(tài)數(shù)組元素最靈活的方法:
int a[] = {0,1,2,3,4,5};
int i;
for( i = 0; i<(sizeof(a)/sizeof(a[0])); ++i);
{
……
……
}
注意:sizeof(a)/sizeof(a[0])在編譯階段就已經(jīng)由編譯器以常量形式給出,不必?fù)?dān)心每次循環(huán)都需要計(jì)算。