軟考程序員輔導:c語言數組注意問題
int a[10];
數組名是常量不能為左值(如:a = 5;)
不要認為數組元素a[i]代表數組元素的值,它代表數組元素本身,可作為左值使用。
為指針進行初始化的字符串是只讀的
(如:char *p = “hello”; strcpy(p, “world”);這樣寫是錯的)
為數組進行初始化的字符串是可寫的
(如:char str[10] = “hello”;strcpy(str, “world”);這樣寫是對的)
注意:
一直以為a代表數組的首地址,可以像指針一樣進行a++等操作,但是,數組名代表數組首地址,一定是個常量!
所以不能對數組名進行 a++ 或者是 a-- 的操作,因為常量不能被修改。
但如果定義指向數組的指針 *p=a;
那么這個指向該數組的指針是可以進行 p++ 或者是 p-- 操作的,指針可以通過這種方式來獲取元素。
數組名 a 除了代表數組的首地址外,它還代表特定的類型,在此例中 a 代表了int[10] 這個類型。
在編譯環境內運行 prinrf(“%d %d)”,sizeof(a),sizeof(p)); 得到了40 4 。
得到這個結果的原因就是數組名 a 代表了它所定義的數組類型int[10],此類型占了10個int型大小的內存,因此是長度是40。
而指針存放的就是某個地址值,不論它指向的是什么類型的地址,都占有固定的4個字節大小。
直接訪問 —— 用變量名訪問。
間接訪問 —— 用地址、指針訪問。
間接訪問: *(首地址 + 偏移) 偏移=下標值 * sizeof(數組元素類型)
? 通過數組下標訪問數組元素也是間接訪問。
a[ i ] <==> *(a + i* sizeof(數組元素類型)) (每次偏移一個數組元素類型大小的字節數)
查看動態數組的大小:
(注意頭文件:#include
int *p = (int *)malloc(sizeof(int)*10);
printf(“%d ”,_msize(p)) ;
輸出結果是40。
訪問靜態數組元素最靈活的方法:
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])在編譯階段就已經由編譯器以常量形式給出,不必擔心每次循環都需要計算。