[問題] 若ptr為整數型態指標 ptr+1 = = ptr ++ ?

看板C_and_CPP作者 (不要想啦)時間16年前 (2009/06/14 15:01), 編輯推噓9(9018)
留言27則, 4人參與, 最新討論串1/2 (看更多)
各位版友好 想請問的是一個指標問題 是出自於國考 我在貴板有翻過相關文章 似乎沒有類似的 所以上來發文 希望沒有漏掉 若有 請告知 我會刪文 謝謝各位 _________________ 以下是問題 _______________________ 宣告變數如下: int array[3][2]={{10,20},{15,25},{50,40}}; int **ptr1=array; int ptr 問以下運算結果為 (1)ptr1+1=&array[0]; 答: 編譯錯誤,因為運算式不可置於=的左側 (因為運算式沒有L-value) 我的想法: 解答意思應該是指 左側要放的是一個記憶體位置 而不是一個運算式 如同你不能宣告 int a ; a+1=3; 一樣 但我小疑惑的是 指標比其他型態特殊的地方在於 指標若作運算 結果還是一個記憶體位置 例如: int *a;//若此時a=00XX8000; 若a=a+1;則a現值為00XX8004 還是一個記憶體位置 為何不能放在左側當做儲存位置呢? 若改為以下 ++ptr1=&array[0] 則會成立 因為相當於 ptr1=&array[0]; ptr1=ptr+1; 所以ptr++=&array[0];就會錯了 對吧? __________________________________________________________________________ 手邊不是自己電腦 不能編譯 所以上來請教大家 唉~ 有時候若能懂編譯器的實作原理 學程式真的會觀念更好更清楚一點 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.27.5

06/14 23:08, , 1F
小弟覺得您可能可以search一下L-value與R-value的意思@@
06/14 23:08, 1F

06/14 23:10, , 2F
int a, b; a = b; //先別管a,b的初值什麼的好了....
06/14 23:10, 2F

06/14 23:10, , 3F
= (assign) 的左邊是int a, 右邊是int b, 您可否想過
06/14 23:10, 3F

06/14 23:11, , 4F
=的左邊需要的東西與右邊需要的東西:) 這就是l-value與
06/14 23:11, 4F

06/14 23:12, , 5F
r-value的關係; l-value需要一個位址, 這個位址比較不像
06/14 23:12, 5F

06/14 23:12, , 6F
是pointer, &(取址)算子這邊的位址的觀念....
06/14 23:12, 6F

06/14 23:16, , 7F
對=右邊的b來說, 需要的是b的值; 對=左邊的a來說, 是需
06/14 23:16, 7F

06/14 23:17, , 8F
要把b的值寫到a的位址去, 這就是簡單的l/r-value的差異
06/14 23:17, 8F

06/14 23:19, , 9F
所以說運算式沒有左值, 跟它是不是pointer沒有關係的@@
06/14 23:19, 9F

06/14 23:23, , 10F
具體精確的解釋就留待其他高手們來說明了....<(_ _)>
06/14 23:23, 10F

06/14 23:27, , 11F
我知道L value的意思 但還是對於實作不是清楚 @@'' 謝謝
06/14 23:27, 11F

06/14 23:30, , 12F
可是 請問左邊(ptr1+1)現在就是一個記憶體位置 不是嗎?
06/14 23:30, 12F

06/14 23:32, , 13F
它是一個address, 但不是(也沒辦法是)一個L-value:)
06/14 23:32, 13F
※ 編輯: Dsigma 來自: 114.42.27.5 (06/14 23:57)

06/15 00:48, , 14F
根據C++ Primer,expression(運算式=運算元+運算子構成)有兩種
06/15 00:48, 14F

06/15 00:49, , 15F
真懷疑這些考國考的人寫過程式嗎
06/15 00:49, 15F

06/15 00:49, , 16F
lvalue跟rvalue,rvalue只能出現在=右邊。而變數是lvalue。
06/15 00:49, 16F

06/15 00:49, , 17F
記憶體位址比如0x12345678就只是一個常數數值,只能在=右邊。
06/15 00:49, 17F

06/15 01:00, , 18F
另外,不是只有變數(是lvalue)才能放=左邊。如:int var=0;
06/15 01:00, 18F

06/15 01:01, , 19F
int *ptr=&var; *(p+1)=0xFFFFFFFF; 你下中斷點就會看到var後
06/15 01:01, 19F

06/15 01:02, , 20F
面的4 bytes被更改數值變成-1了(2的補數)。這是透過*運算子,
06/15 01:02, 20F

06/15 01:02, , 21F
做dereference
06/15 01:02, 21F

06/15 01:06, , 22F
補充一下,在VC可能ptr=0x0012ff60,ptr+1=0x0012ff64都是右值
06/15 01:06, 22F

06/15 01:06, , 23F
原本是不能放=的左邊,但因為*運算子的運算優先順序大於=故先*
06/15 01:06, 23F

06/15 01:07, , 24F
使其變成左值了
06/15 01:07, 24F

06/15 01:43, , 25F
回avhacker 大部份的人都寫過 裡面不乏資深程式設計師
06/15 01:43, 25F

06/15 01:44, , 26F
z大好 謝謝你認真回應 :)
06/15 01:44, 26F

06/15 01:45, , 27F
最近剛好有看這方面的文章,順便請版友看看我的觀念有沒有問題
06/15 01:45, 27F
文章代碼(AID): #1ADH2yun (C_and_CPP)
文章代碼(AID): #1ADH2yun (C_and_CPP)