網域名稱俱樂部

網域名稱俱樂部 (https://www.domainclub.org/index.php)
-   一般軟體與網路使用討論 (https://www.domainclub.org/forumdisplay.php?f=43)
-   -   指標與陣列 (https://www.domainclub.org/showthread.php?t=36763)

哈啦 2014-06-20 10:25 PM

指標與陣列
 
據說陣列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

yumi 2014-06-21 10:33 PM

阵列名称str永远指向第0个元素。str++如何加?没法移动。
指针p是可以变化的,p[1]原先指向第2个单元,p++之后,现在指向第3个单元了,实际是移动了。

哈啦 2014-06-21 10:44 PM

引用:

作者: yumi (文章 192715)
阵列名称str永远指向第0个元素。str++如何加?没法移动。
指针p是可以变化的,p[1]原先指向第2个单元,p++之后,现在指向第3个单元了,实际是移动了。


原來如此,所以str[]的str和p一樣都指向第一個元素,可以當指標使用,但畢竟它是這個陣列的名稱,「它」應該就是被固定在str[0]這個位址上,而p則是從別處指到這裡,也可以指到下一個或下下一個。

many thanks!!~yes


所有時間均為 +8。現在的時間是 07:27 PM

Powered by vBulletin® 版本 3.8.4
版權所有 ©2000 - 2024,Jelsoft Enterprises Ltd.