找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
感激所有對伊莉作出奉獻的人發表文章前請先閱讀相關版規你準備好成為出色的版主了嗎?
mg催眠波多野結流出rpg國中流出
wicked i蛇魔jul 702lonarpggbvs重生者ghost

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

[繁]我的英雄學院 第

✡ 斗破蒼穹 年番/鬥

[繁]怪獸八號05-

[繁]轉生貴族憑鑑定技

[繁]Re:Monster 07-

[簡]終末的火車前往何
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 1489|回復: 9
打印上一主題下一主題

[討論]C array pass by reference[複製鏈接]

kado781983 該用戶已被刪除
跳轉到指定樓層
樓主
發表於 2014-2-2 08:55 AM|只看該作者|倒序瀏覽
問一下C program, 傳入的array address, 為何改變不到傳呢, 請指教, 謝謝



附件: 你需要登錄才可以下載或查看附件。沒有帳號?註冊
分享分享0收藏收藏0支持支持0
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

Rank: 1

帖子
141
積分
191 點
潛水值
16350 米
頭香
發表於 2014-2-2 10:25 AM|只看該作者
本帖最後由 k50402k 於 2014-2-2 04:49 PM 編輯

char array[] = "DEF";這種方式只能用在宣告變數時(如上),會自動幫你規畫空間大小
array只不過是陣列的第一個address
address怎麼能放入char勒?

所以比較簡單的做法就是用
strcpy或是自己跑回圈塞進去吧

下載: 訪客無法瀏覽下載點,請先 註冊登入會員
...
瀏覽完整內容,請先 註冊登入會員
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。

使用道具檢舉

帖子
100
積分
93 點
潛水值
9200 米
3
發表於 2014-2-2 04:09 PM|只看該作者
本帖最後由 gitlab 於 2014-2-2 04:16 PM 編輯

觀念錯很大,
(1) C 只有 pass by value,沒有 pass by reference。

(2) C 是不能「直接把陣列傳入函式」的。
在函式的parameter裡,char array[] 完全同義於 char *array,而你呼叫 funcA( array ) 時,編譯器自動幫你轉換成 funcA( &array[0] ); 意思就是:你以為你傳入陣列給一個接收陣列的函式,實際上是傳入指標和接收指標。
...
瀏覽完整內容,請先 註冊登入會員
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。

使用道具檢舉

帖子
100
積分
93 點
潛水值
9200 米
4
發表於 2014-2-2 09:58 PM|只看該作者
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。
array只不過是陣列的第一個address
address怎麼能放入char勒?


第一句話沒問題,問題在第二句。
樓主寫的

   array = "DEF";

並非您說的「將 char 放入 pointer 」,而是「將 const char * 指派給 char *」。

但這不是問題核心,核心在於因為此處 pointer 為 pass-by-value,所以不會影響到外界的變數。
...
瀏覽完整內容,請先 註冊登入會員
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。

使用道具檢舉

kado781983 該用戶已被刪除
5
發表於 2014-2-2 11:12 PM|只看該作者
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。
謝謝2位大神的回答, 我還有些問題還不太理解
1) 像 "DEF" 這種固定字串的型態是 const char *,你把他丟給 array(型態是 char *)本身有違常數正確性。  這句const char* 本身也是一種array吧? 因為他需要連續的char才可以容納"ABC"這個字串, 那兩種的分別是在那裡呢?

2) gitlab大大提供的  funcA(&array); 本是傳一個地址給funcA, 在
void funcA(const char **array)  *array本身也是儲著array的地址, 為何要再加**array呢...
瀏覽完整內容,請先 註冊登入會員





如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。

使用道具檢舉

帖子
100
積分
93 點
潛水值
9200 米
6
發表於 2014-2-3 01:25 AM|只看該作者
本帖最後由 gitlab 於 2014-2-3 01:27 AM 編輯

先弄清楚當我們寫下 "DEF" 時發生什麼事。編譯器做的事情如下:i. 在唯讀區連續放入 {'D', 'E', 'F', '\0'} 四個 char;ii. 找出剛剛第一個 char 的位址,取代放在原來 "DEF" 的地方。例如

  puts("DEF");

可以看成:

  const char anonymous_string[4] = { 'D', 'E', 'F', '\0' };
...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

帖子
100
積分
93 點
潛水值
9200 米
7
發表於 2014-2-3 01:39 AM|只看該作者
本帖最後由 gitlab 於 2014-2-3 01:41 AM 編輯

回答你第二個問題。

先想想,如果打算透過函式改變一個 int 該怎麼做呢?應該很容易就可以想到

  void funcA( int *a ) { *a = 2; }

那麼再想想,透過函式改變一個 const char * 又該怎麼做呢?const char * 也是一種型態,所以剛剛在 int 怎麼做,現在就怎麼做,把 int 全都換成 const char * 就對了:
...
瀏覽完整內容,請先 註冊登入會員
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。

使用道具檢舉

kado781983 該用戶已被刪除
8
發表於 2014-2-3 01:50 PM|只看該作者
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
謝謝大大 精心回答, 那在學校老師說的就是有問題了嗎, 都說pass by reference....

那我以後見到連續的char 就是應該用 const char* 而不再需要用 array[]了吧?

再一個關於const char*的問題, 如果是有一串char e.g. "ABCDEFG", 裡面需要做String替換, e.g. 將DEF 改為 12, 我在網上尋找過用strncpy, memcpy 等的方法, 但是後面的位沒有被覆蓋, 我應該從那個方向著手呢, 是尋找DEF 這個string 還是 D, E, F 分開來找呢, 謝謝
...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

Rank: 2Rank: 2

帖子
1051
積分
617 點
潛水值
27340 米
9
發表於 2014-2-6 05:51 PM|只看該作者
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
kado781983 發表於 2014-2-3 01:50 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

謝謝大大 精心回答, 那在學校老師說的就是有問題了嗎, 都說pass by reference....

那我以後見到連續的char ...

是實上. 連java 也是pass by value
...
瀏覽完整內容,請先 註冊登入會員
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。

使用道具檢舉

Rank: 1

帖子
268
積分
185 點
潛水值
17158 米
10
發表於 2014-2-16 01:58 AM|只看該作者
如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。
kado781983 發表於 2014-2-3 01:50 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

謝謝大大 精心回答, 那在學校老師說的就是有問題了嗎, 都說pass by reference....

那我以後見到連續的char ...

要看你這個問題的複雜度,
...
瀏覽完整內容,請先 註冊登入會員





如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部