Re: [問題] ++運算符號實際運作的時機?

看板C_and_CPP作者 (abc)時間15年前 (2009/06/28 02:12), 編輯推噓6(6017)
留言23則, 5人參與, 最新討論串3/3 (看更多)
※ 引述《giveatry (new life)》之銘言: : ※ 引述《giveatry (new life)》之銘言: : : #include <stdio.h> : : int main(){ : : int* c = 1; : : printf("c++ is %d\n", c++); : : printf("c is %d\n", c); : : return 0; : : } : : 印出來的結果 : : c++ is 1 : : c is 5 : : 為什麼會這樣呢ꄊ: : 謝謝 : 我改成這樣的時候 : #include <stdio.h> : #include <stdlib.h> : int main(){ : int* c = (int*)malloc(sizeof(int)*1); : *c = 1; : printf("c++ is %d\n", c++); : printf("c is %d\n", c); : return 0; : } : 印出來的結果是 : c++ is 159821832 : c is 159821836 : 改成這樣的話,好像就是印記憶體位置了 : 愈搞愈迷糊了@@ 雖然我不常寫c不過看好像沒人要理你這個問題 我就來點你一下好了,先說~我是看你的實驗說故事的 你第一個宣告指標c int* c=1; 是把指標c指到1這個位置了 而 printf("c++ is %d\n", c++); 印出了c這個指標位置1 再移到下一個位置 不過你宣告的是int這個有4個byte,所以跳4,因此你看到的+4是這邊來的 第二個int* c = (int*)malloc(sizeof(int)*1); 這個是你叫電腦幫你選出一個有一個int大小的位置,把c指向那邊 電腦給你159821832這個位置,接下來你又作了一樣的事情 所以呢,從頭到尾差別只有 手動選號(1) 跟 電腦選號(159821832) 的差別而已 不過手動選號是很危險的 因為你不知道這號碼有沒有人在使用,除非你很確定 否則不要作這樣的動作 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.115.26.253

06/28 02:15, , 1F
仔細看了一下推文..victortom大大好像解釋一樣的東西XD
06/28 02:15, 1F

06/28 09:06, , 2F
應該是原PO的癥結在於他不曉得 int* c=1;
06/28 09:06, 2F

06/28 09:06, , 3F
printf("c++ is %d\n", c++); 也是在印出位置
06/28 09:06, 3F

06/28 10:05, , 4F
感謝,我終於知道我的問題在哪裡了…問題在int* c = 1
06/28 10:05, 4F

06/28 10:18, , 5F
若是*c = 1,是指把c所指的值設為1。但是int*c =1和
06/28 10:18, 5F

06/28 10:18, , 6F
*c = 1意義完全不同,我就是這樣搞混了…
06/28 10:18, 6F

06/28 14:46, , 7F
我怎麼覺得你還是不懂耶 "int* c = 1 *c = 1意義完全不同"??
06/28 14:46, 7F

06/28 15:09, , 8F
int* c = 1是宣告一個int指標並將其指向位址1
06/28 15:09, 8F

06/28 15:09, , 9F
*c = 1是把指標c所指之值設為1,難道我又誤解了嗎?
06/28 15:09, 9F

06/28 15:22, , 10F
int *c = 1; 宣告指標變數c並使初值為1(指向1這個位址)
06/28 15:22, 10F

06/28 15:23, , 11F
*c = 1; 指標c目前所指的位址給定新值為1(被指位址給1)
06/28 15:23, 11F

06/28 15:25, , 12F
Ex: int *c = 0x0100; *c = 0x0010;
06/28 15:25, 12F

06/28 15:25, , 13F
則c會指到0x0100這個位址, 並讓這個位址上的值變0x0010
06/28 15:25, 13F

06/28 15:27, , 14F
PS. 未確認的位址胡亂給值很危險的 XD
06/28 15:27, 14F

06/28 17:13, , 15F
v大,所以我推文8,9行的理解看起來和你是一樣的?
06/28 17:13, 15F

06/28 20:43, , 16F
你沒誤解啦 老實說要是我我也不會知道是那樣 我從來不會
06/28 20:43, 16F

06/28 20:44, , 17F
像你那樣寫 因為pointer通常拿來動態宣告一個陣列或是寫
06/28 20:44, 17F

06/28 20:44, , 18F
類似linked list這樣的東西 你應該也只是試驗而已 寫程式
06/28 20:44, 18F

06/28 20:44, , 19F
就是這樣啊 精神很不錯的
06/28 20:44, 19F

06/28 20:54, , 20F
啊 還有call by reference也是pointer蠻重要的概念 其實
06/28 20:54, 20F

06/28 20:54, , 21F
爬文看看 上面很多人討論過一樣的東西唷
06/28 20:54, 21F

06/28 23:39, , 22F
其實我只是搞不清楚到底誰了解的情況怎麼辦所以乾脆完整
06/28 23:39, 22F

06/28 23:39, , 23F
重推一次而已....XD
06/28 23:39, 23F
文章代碼(AID): #1AHc3mvc (C_and_CPP)
文章代碼(AID): #1AHc3mvc (C_and_CPP)