作者cheinhun (abc)
看板C_and_CPP
標題Re: [問題] ++運算符號實際運作的時機?
時間Sun Jun 28 02:11:59 2009
※ 引述《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
1F:→ cheinhun:仔細看了一下推文..victortom大大好像解釋一樣的東西XD 06/28 02:15
2F:→ Cloud:應該是原PO的癥結在於他不曉得 int* c=1; 06/28 09:06
3F:→ Cloud:printf("c++ is %d\n", c++); 也是在印出位置 06/28 09:06
4F:推 giveatry:感謝,我終於知道我的問題在哪裡了…問題在int* c = 1 06/28 10:05
5F:推 giveatry:若是*c = 1,是指把c所指的值設為1。但是int*c =1和 06/28 10:18
6F:→ giveatry:*c = 1意義完全不同,我就是這樣搞混了… 06/28 10:18
7F:推 in09:我怎麼覺得你還是不懂耶 "int* c = 1 *c = 1意義完全不同"?? 06/28 14:46
8F:→ giveatry:int* c = 1是宣告一個int指標並將其指向位址1 06/28 15:09
9F:→ giveatry:*c = 1是把指標c所指之值設為1,難道我又誤解了嗎? 06/28 15:09
10F:推 VictorTom:int *c = 1; 宣告指標變數c並使初值為1(指向1這個位址) 06/28 15:22
11F:→ VictorTom:*c = 1; 指標c目前所指的位址給定新值為1(被指位址給1) 06/28 15:23
12F:→ VictorTom:Ex: int *c = 0x0100; *c = 0x0010; 06/28 15:25
13F:→ VictorTom:則c會指到0x0100這個位址, 並讓這個位址上的值變0x0010 06/28 15:25
14F:→ VictorTom:PS. 未確認的位址胡亂給值很危險的 XD 06/28 15:27
15F:推 giveatry:v大,所以我推文8,9行的理解看起來和你是一樣的? 06/28 17:13
16F:→ cheinhun:你沒誤解啦 老實說要是我我也不會知道是那樣 我從來不會 06/28 20:43
17F:→ cheinhun:像你那樣寫 因為pointer通常拿來動態宣告一個陣列或是寫 06/28 20:44
18F:→ cheinhun:類似linked list這樣的東西 你應該也只是試驗而已 寫程式 06/28 20:44
19F:→ cheinhun:就是這樣啊 精神很不錯的 06/28 20:44
20F:→ cheinhun:啊 還有call by reference也是pointer蠻重要的概念 其實 06/28 20:54
21F:→ cheinhun:爬文看看 上面很多人討論過一樣的東西唷 06/28 20:54
22F:推 VictorTom:其實我只是搞不清楚到底誰了解的情況怎麼辦所以乾脆完整 06/28 23:39
23F:→ VictorTom:重推一次而已....XD 06/28 23:39