Re: [問題] 關於指標

看板C_and_CPP (C/C++)作者 (最愛朴素妍)時間15年前 (2010/10/23 16:55), 編輯推噓15(15015)
留言30則, 6人參與, 最新討論串4/6 (看更多)
※ 引述《vm6jp6rmp4 (Jun)》之銘言: : 請容許各位大大再讓我問個問題,我指標真的有點弱 : #include <stdio.h> : #include <stdlib.h> : #include <string.h> : void swap(char *y,int len) : { : printf("y=%p\n",&y); : char temp; : temp=*(y+len-1); : *(y+len-1)=*(y); : *y=temp; : } : int main(void) : { : char x[]="Hello"; : char *z=x; x["Hello"]; ↑ z┘ : printf("x=%p\n",x); : printf("z=%p\n",z); 如果直接把 x 當指標來用, 他的值實際上就是 &x[0], 所以上面兩者相同 : int len=strlen(x); : swap(z,len); ┌y ↓ x["Hello"]; ↑ z┘ 你仔細看 y 跟傳進去的 z 是一樣型態, 所以他們都是 指到 x 陣列中第一個字元的位置, 而 &y只不過是另一 個變數的位址而已, 對這個問題並沒有多大關係. 記得國中數學老師對我們說 : 「畫圖可以解決所有的問題」 現在還是深信不疑... 甭想那麼多, 動筆下去畫就對了! : printf("%s",x); : system("pause"); : } : 關於這個程式我,我假設X開頭位置是2000,假設z的位置是2010並指向2000這個起始位置 : ,y指向z的位置2010,但為什麼y可以更改x的內容呢?並沒有把y設成指標的指標**y : 另外若把z拿掉,改成swap(x,len),一樣得到同樣結果?若有人能幫我離清這指標的指標 : 真是感激不盡! -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢█歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115

10/23 17:01, , 1F
啊啊,比我早一步回
10/23 17:01, 1F

10/23 17:16, , 2F
我也想問一下(舉手) string資料儲存的方式
10/23 17:16, 2F

10/23 17:17, , 3F
是不是char* 最後面加一個\0呢 ?
10/23 17:17, 3F

10/23 17:23, , 4F
樓上想問 C++ 的 string? 那不一定
10/23 17:23, 4F

10/23 17:25, , 5F
string實作看不同library會不同..
10/23 17:25, 5F

10/23 17:26, , 6F
就算是C,也該是好幾個char最後加一個值為\0的char
10/23 17:26, 6F

10/23 17:27, , 7F
是C++的沒錯 想問的是 #include<cstring> 怎麼存的
10/23 17:27, 7F

10/23 17:27, , 8F
不好意思沒說清楚@"@
10/23 17:27, 8F

10/23 17:29, , 9F
cstring...?
10/23 17:29, 9F

10/23 17:30, , 10F
啊...手殘多打一個C ˇˇ"
10/23 17:30, 10F

10/23 17:36, , 12F
裡面存的成員一堆,但一塊連續的記憶體來放char是免不了
10/23 17:36, 12F

10/23 17:37, , 13F
至於有沒有\0,感覺有或沒有都無關緊要,應該吧
10/23 17:37, 13F

10/23 17:42, , 14F
感謝purpose大 這樣看起來要抓某一個char的&好像有困難
10/23 17:42, 14F
你無法確定那個字元物件是否於 string 變長之後還存 在, 存取資料應該用該類別的介面來存取([] 或是迭代 器)

10/23 17:44, , 15F
抓某一個char的&?你想要做的事情是什麼呢?
10/23 17:44, 15F
※ 編輯: loveme00835 來自: 140.121.197.115 (10/23 17:48)

10/23 17:47, , 16F
我想要用兩個char* 一個放這個string的結束位置
10/23 17:47, 16F

10/23 17:48, , 17F
令一個則可以指到這個string中任一個char的位置
10/23 17:48, 17F
string::iterator 可以達成你要的功能, 雖然其操作跟 隨機存取指標很像, 但是實際上有可能不是 ※ 編輯: loveme00835 來自: 140.121.197.115 (10/23 17:50)

10/23 17:51, , 18F
這正是 iterator 想達成的目標: 用類似指標的操作隱藏下面
10/23 17:51, 18F

10/23 17:51, , 19F
實際上的複雜操作
10/23 17:51, 19F

10/23 17:52, , 20F
感謝loveme00835大 先試試看@.@
10/23 17:52, 20F

10/23 17:52, , 21F
+LPH66大
10/23 17:52, 21F
記住一點: 字串的大小如果有變, 所有的迭代器都可能 因為記憶體重配置而失效, 所以每次存取都 要呼叫 begin/end 再算一次 ※ 編輯: loveme00835 來自: 140.121.197.115 (10/23 17:58)

10/23 18:00, , 22F
謝謝各位ˇˇ" 問題已解決
10/23 18:00, 22F

10/23 18:02, , 23F
原來string裡面就有這個function了 Q.Q
10/23 18:02, 23F

10/23 18:03, , 24F
那如果不知道有這功能 想破頭也想不出來吧(就是在下 淚)
10/23 18:03, 24F

10/23 18:05, , 25F
所以像cplusplus這種網站就很好用
10/23 18:05, 25F

10/23 18:07, , 26F
(筆記)
10/23 18:07, 26F

10/23 18:10, , 27F
http://tinyurl.com/2eb9cav 大大們解釋很棒,這篇也不錯
10/23 18:10, 27F

10/23 18:11, , 28F
他舉了*(取值)的例子,並不是真的對記憶體位址取值,而是
10/23 18:11, 28F

10/23 18:11, , 29F
傳回資料成員
10/23 18:11, 29F

10/23 18:13, , 30F
要謝的人太多 那就謝天吧(汗
10/23 18:13, 30F
文章代碼(AID): #1CmgBgTw (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
5
10
完整討論串 (本文為第 4 之 6 篇):
2
3
5
10
3
10
文章代碼(AID): #1CmgBgTw (C_and_CPP)