看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
loveflames:啊啊,比我早一步回 10/23 17:01
b98901056:我也想問一下(舉手) string資料儲存的方式 10/23 17:16
b98901056:是不是char* 最後面加一個\0呢 ? 10/23 17:17
LPH66:樓上想問 C++ 的 string? 那不一定 10/23 17:23
tomap41017:string實作看不同library會不同.. 10/23 17:25
purpose:就算是C,也該是好幾個char最後加一個值為\0的char 10/23 17:26
b98901056:是C++的沒錯 想問的是 #include<cstring> 怎麼存的 10/23 17:27
b98901056:不好意思沒說清楚@"@ 10/23 17:27
james732:cstring...? 10/23 17:29
b98901056:啊...手殘多打一個C ˇˇ" 10/23 17:30
purpose:裡面存的成員一堆,但一塊連續的記憶體來放char是免不了 10/23 17:36
purpose:至於有沒有\0,感覺有或沒有都無關緊要,應該吧 10/23 17:37
b98901056:感謝purpose大 這樣看起來要抓某一個char的&好像有困難 10/23 17:42
你無法確定那個字元物件是否於 string 變長之後還存 在, 存取資料應該用該類別的介面來存取([] 或是迭代 器)
james732:抓某一個char的&?你想要做的事情是什麼呢? 10/23 17:44
※ 編輯: loveme00835 來自: 140.121.197.115 (10/23 17:48)
b98901056:我想要用兩個char* 一個放這個string的結束位置 10/23 17:47
b98901056:令一個則可以指到這個string中任一個char的位置 10/23 17:48
string::iterator 可以達成你要的功能, 雖然其操作跟 隨機存取指標很像, 但是實際上有可能不是 ※ 編輯: loveme00835 來自: 140.121.197.115 (10/23 17:50)
LPH66:這正是 iterator 想達成的目標: 用類似指標的操作隱藏下面 10/23 17:51
LPH66:實際上的複雜操作 10/23 17:51
b98901056:感謝loveme00835大 先試試看@.@ 10/23 17:52
b98901056: +LPH66大 10/23 17:52
記住一點: 字串的大小如果有變, 所有的迭代器都可能 因為記憶體重配置而失效, 所以每次存取都 要呼叫 begin/end 再算一次 ※ 編輯: loveme00835 來自: 140.121.197.115 (10/23 17:58)
b98901056:謝謝各位ˇˇ" 問題已解決 10/23 18:00
b98901056:原來string裡面就有這個function了 Q.Q 10/23 18:02
b98901056:那如果不知道有這功能 想破頭也想不出來吧(就是在下 淚) 10/23 18:03
loveflames:所以像cplusplus這種網站就很好用 10/23 18:05
b98901056:(筆記) 10/23 18:07
purpose:http://tinyurl.com/2eb9cav 大大們解釋很棒,這篇也不錯 10/23 18:10
purpose:他舉了*(取值)的例子,並不是真的對記憶體位址取值,而是 10/23 18:11
purpose:傳回資料成員 10/23 18:11
b98901056:要謝的人太多 那就謝天吧(汗 10/23 18:13