#1
|
||||
|
||||
指標與陣列
據說陣列str[10]的str可以當成指標來用。
#include <stdio.h> int main(void) { int str[4]={10,25,44,63}; int *p; p=str; printf("%d\n",p[3]); printf("%d\n",str[3]); printf("%d\n",p); printf("%d\n",*p); printf("%d\n",str); printf("%d\n",*str); return 0; } 上述的程式跑出來之後,確實str和p得到的結果都是一樣的。 但書上有特別提到,「然而,你無法更改一個陣列名稱產生的指標」例如上例中的str。而「str++」是錯誤的,因為「陣列產生的指標str會被視為常數,它指向陣列的開端。因此,這是無效的修改,編譯器會產生錯誤訊息。」 因此我做了如下的範例: #include <stdio.h> int main(void) { int str[4]={10,25,44,63}; int *p; p=str; str++; printf("%d",str[1]); return 0; } 果然編譯器出現錯誤訊息。 但如果是把 str++ 改成 p++,然後求p[1],則編譯執行正確。 #include <stdio.h> int main(void) { int str[4]={10,25,44,63}; int *p; p=str; p++; printf("%d",p[1]); return 0; } so,能請先進解釋一下嗎?既然str[4]的str可以當指標來用,縱然另外又指定一個指標變數 p,而p=str,二者似乎完全可以互換著用,那為何在str=str+1這一點卻不行,而p=p+1則可以?其中的邏輯在哪裡呢? thanks |
#2
|
|||
|
|||
阵列名称str永远指向第0个元素。str++如何加?没法移动。
指针p是可以变化的,p[1]原先指向第2个单元,p++之后,现在指向第3个单元了,实际是移动了。
__________________
收购各位版友的四字母com、数字米com/net/cc、三杂米com、拼音米。价格随行市价。站内联系。 |
#3
|
||||
|
||||
原來如此,所以str[]的str和p一樣都指向第一個元素,可以當指標使用,但畢竟它是這個陣列的名稱,「它」應該就是被固定在str[0]這個位址上,而p則是從別處指到這裡,也可以指到下一個或下下一個。 many thanks!! |