今天偶然間看到一個問題,於是乎去學習了下,記錄一下對數組名的一個知識點。
數組名:是指針常量。
出錯代碼:
int aa[10] = {0};
int num = 0;
for(num = 0; num < 10; num ++)
{
aa[num] = num;
}
int *bb = (int *)malloc(40);
memset((void *)bb, 0, 40);
for(num = 0; num < 10; num ++)
{
printf("%d\n",aa[0]);
++aa;
}
編譯就無法通過:error: lvalue required as increment operand
正確代碼:
for(num = 0; num < 10; num ++)
{
printf("%d\n",bb[0]);
++bb;
}
原因:aa 數組名是指針常量,不可以進行自加運算。
延伸拓展:
(1) 數組名表示的就是一種數據結構,就是數組;
(2) 數組名可以轉換成一個指針常量;
(3) 指向數組的指針則是指針變量,存放著的是數組的地址!
下面又出現一個問題:
void arrayTest(char str[])
{
printf("%d\n",sizeof(str));
}
int main()
{
char str1[10] = "I Love U";
arrayTest(str1);
return 0;
}
打印結果為4(32位系統)/8(64位系統)。
原因分析 :當數組名作為形參傳入時候,只是一個指針變量了,可以做自增、自減操作。
形參char str[]等同於char *str
補充說明:對於一個指針來說,char *aa = (char *)malloc(10);
以下運算合法,與aa是不是數組無關。
*(aa + n) = aa
; (n < 10)
還有一點需要說明:
對於上面例子中的bb指針來說,不需要做free(bb)操作,因為aa在結束時候會被干掉,bb要是free的話會造成二次free,這樣就報錯了。