網域名稱俱樂部


返回   網域名稱俱樂部 > 電腦與網路技術 > 電腦網路相關技術 > 一般軟體與網路使用討論
論壇幫助 社區 日曆事件 今日新文章 搜尋

回覆
 
主題工具
  #1  
舊 2014-06-20, 10:25 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,058
預設 指標與陣列

據說陣列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
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #2  
舊 2014-06-21, 10:33 PM
yumi yumi 目前離線
進階會員
 
註冊日期: 2005-12-29
文章: 1,373
預設

阵列名称str永远指向第0个元素。str++如何加?没法移动。
指针p是可以变化的,p[1]原先指向第2个单元,p++之后,现在指向第3个单元了,实际是移动了。
__________________
收购各位版友的四字母com、数字米com/net/cc、三杂米com、拼音米。价格随行市价。站内联系。
回覆時引用此篇文章
  #3  
舊 2014-06-21, 10:44 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,058
預設

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

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

many thanks!!
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
回覆


發文規則
不可以發表新主題
不可以發表回覆
不可以上傳附件
不可以編輯自己的文章

啟用 BB 代碼
論壇啟用 表情符號
論壇啟用 [IMG] 代碼
論壇禁用 HTML 代碼



所有時間均為 +8。現在的時間是 10:04 AM


本站主機由網易虛擬主機代管
Powered by vBulletin® 版本 3.8.4
版權所有 ©2000 - 2024,Jelsoft Enterprises Ltd.