PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   VC++的幾個問題part05.. (https://www.pcdvd.com.tw/showthread.php?t=257830)

SGI 2003-10-16 09:56 AM

引用:
Originally posted by harrisonlin
你是否對於"指標指向的資料長度不一,卻又同樣只佔 4 bytes"感到疑惑呢?

其實詳細地說,指標記錄著某個"位址",而這個"位址"只是代表著某一"段"記憶體的開頭,裡頭存放著某些資料,舉例來說 :

int a = 10;
int *p = &a;

假設目前 a 在記憶體中的位址是 1000,那麼 p 目前的值就是 1000。因為一個在32 位元機器的 int 上是 4 bytes,所以接下來的1001, 1002, 1003就是這個變數 a 所佔用的空間,裡頭存放著 10, 指標 p 只是指向 1000 這個位址。當程式透過 p 來讀取變數 a 的值時,系統會讀取從 p 所指向的位址開始之後的 4 bytes (1000, 1001, 1002, 1003)的資料,並把它傳給程式。指標就像是一個標籤,記著記憶體中的某個位址,而這個位址之後多少 bytes 是屬於這個資料的,就看指標所指向的型態了:若是 int 指標,那麼指向位址後的 4 bytes(或 2 bytes,在 16 位元的機器上)就是這一個 int 的值;若是 float 指標,那麼指向位址後的 4 bytes 就是一個 float 的值。指向char 的指標就比較不同,從"指標指向的位址起"至"第一個'\0'出現的位址"止,是一個字串的值。

這樣解釋明白了嗎?;)

------------------------------------------------------------------
十分感謝大大您詳細的說明唷
每次都讓您打一大堆字真是不好意思
沒想到又是牽涉到計概的東西啊

1)照大大您舉的例子,是說因為在32 位元機器的 int 上是 4 bytes
而整數值是除存在1000~1003的位址
所以不管值宣告多少,只要是整數型態都是占用這4byte
應該是這個意思吧?

2)那麼"將10存到1000~1003位址的方式"是不是又是一門學問呢?

3)那麼這4byte到底最高極限能存取多大的值呢?有正負號之分嗎?

4)大大您覺得我有沒有必要先把VC++丟一邊,去惡補點計概的東西啊?

SGI 2003-10-16 10:06 AM

引用:
Originally posted by phonxe
有時候pointer跟array是可以混著用,
compiler會自動幫你處理好,如:
char p1[]="01234";
char* p2="01234";

cout<< p1 << " " << p2 <<endl;
cout<< p1[0] << " " << p2[0] <<endl;
前後都會有相同的輸出 :
01234 01234
0 0

cout<< sizeof(p1) << " " << sizeof(p2) <<endl;
但這會輸出什麼呢?
答案是:
6 4

sizeof(p1) 等於 6:
因為 p1 是個array,內容為 "01234" + '\0' 共六個 byte

而 sizeof(p2) 等於 4:
因為 p2 是個 pointer ,在 32bits 的電腦架構下就是 32bits==4bytes
至於 p2 指到的內容 "01234\0" 則是用另外的記憶體空間來儲存

------------------------------------------------------------------
很感謝大大您參與討論唷
1)但是您這部份

char* p2="01234";

小弟看不太懂唷
p2宣告為char型態的指標
但指標不是都儲存"值在記憶體的位置"嗎?
可以直接這樣指定值嗎?

2)還有您做了以下宣告
char* p2="01234";

但又
cout<< p1[0] << " " << p2[0] <<endl;

p2又沒被宣告為array
為何可以cout <<p2[0]?

請給小弟點意見,謝謝

harrisonlin 2003-10-16 11:04 AM

1)只要你宣告了一個變數,那麼不管這個變數的內容為何,它所佔的記憶體位址是固定的!以 int 來說,不管你存入的值是 0 還是 65535,它都佔 4 (或著 2) bytes。

2)在例子中所提到的"1000~1003",只是我假設的一個位址。在程式執行時,所有的記憶體位址都是OS分配給你的!如果你想直接地、不經OS分配地寫資料到某個絕對位址,可能會覆蓋到其它程式的資料...也許是OS正在使用的記憶體,那就有可能造成系統,甚至硬體的毀損哦!

3)記憶體位址並沒有負的,所以32位元定址的系統最大可以存取到4294,967,296 bytes的記憶體。

4)我想這兩者可以是相輔相成的。不如你一邊學C/C++,一邊看計概。學習計概上的理論時,C/C++可以是你驗證的工具;學習C++時,計概就是你實作的基礎了!

SGI 2003-10-16 03:40 PM

引用:
Originally posted by harrisonlin
1)只要你宣告了一個變數,那麼不管這個變數的內容為何,它所佔的記憶體位址是固定的!以 int 來說,不管你存入的值是 0 還是 65535,它都佔 4 (或著 2) bytes。

--------------------------------------------------------------------
不好意思啦大大
小弟又有問題打擾您了
針對您上述的:

那如果值超過65535,那還會佔4 byte嗎?

phonxe 2003-10-16 11:01 PM

引用:
Originally posted by SGI
------------------------------------------------------------------
很感謝大大您參與討論唷
1)但是您這部份

char* p2="01234";

小弟看不太懂唷
p2宣告為char型態的指標
但指標不是都儲存"值在記憶體的位置"嗎?
可以直接這樣指定值嗎?

可以,這就是說 p2 是個指到char的pointer,
而在C語言裡字串就是char* (或是char[]),
"01234"就是個字串。

引用:
Originally posted by SGI

2)還有您做了以下宣告
char* p2="01234";

但又
cout<< p1[0] << " " << p2[0] <<endl;

p2又沒被宣告為array
為何可以cout <<p2[0]?

請給小弟點意見,謝謝


這也就是我前面說的
「有時候pointer跟array是可以混著用,
compiler會自動幫你處理好」
pointer跟array的關系可說是密不可分的。

SGI 2003-10-17 09:30 AM

引用:
Originally posted by phonxe
可以,這就是說 p2 是個指到char的pointer,
而在C語言裡字串就是char* (或是char[]),
"01234"就是個字串。



這也就是我前面說的
「有時候pointer跟array是可以混著用,
compiler會自動幫你處理好」
pointer跟array的關系可說是密不可分的。

----------------------------------------------------------------
原來如此...
這點我的書上就沒有寫了
看來指標一時要理解真的是不太容易呢
感謝您給我這麼重要的意見唷
以後仍請大大不吝賜教

harrisonlin 2003-10-17 10:28 AM

引用:
Originally posted by SGI
--------------------------------------------------------------------
不好意思啦大大
小弟又有問題打擾您了
針對您上述的:

那如果值超過65535,那還會佔4 byte嗎?


如果是 4 bytes 的int ,它的可以儲存的值從2147,483,647 ~ -2147,483,648。如果超過這個值,它會從頭算起。例如:

int i = 2147483648;

cout << i << endl;

因為你指派給 i 的值已經超出它可以容納的範圍,所以你會看到 i 的值從另一端算起。你可以自己更改指派給 i 的值觀察一下!

不過無論你指派給 i 多大的值,它還是佔 4 bytes。其它的型別也是一樣!

SGI 2003-10-17 04:00 PM

引用:
Originally posted by harrisonlin
如果是 4 bytes 的int ,它的可以儲存的值從2147,483,647 ~ -2147,483,648。如果超過這個值,它會從頭算起。例如:

int i = 2147483648;

cout << i << endl;

因為你指派給 i 的值已經超出它可以容納的範圍,所以你會看到 i 的值從另一端算起。你可以自己更改指派給 i 的值觀察一下!

不過無論你指派給 i 多大的值,它還是佔 4 bytes。其它的型別也是一樣!

--------------------------------------------------------------
另一端...?
呵呵,小弟我真的越聽越給它模糊下去了
看來不能再撐了
我還是先去找本計概再來和大大您討論吧
感謝大大不厭其煩地講解唷


所有的時間均為GMT +8。 現在的時間是01:20 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。