歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 數組名與指針變量

數組名與指針變量

日期:2017/3/3 13:59:57   编辑:Linux技術

今天偶然間看到一個問題,於是乎去學習了下,記錄一下對數組名的一個知識點。

數組名:是指針常量。

出錯代碼:

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,這樣就報錯了。

Copyright © Linux教程網 All Rights Reserved