PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 疑難雜症區
帳戶
密碼
 

  回應
 
主題工具
SGI
Major Member
 
SGI的大頭照
 

加入日期: Sep 2003
文章: 263
引用:
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++丟一邊,去惡補點計概的東西啊?
     
      
舊 2003-10-16, 09:56 AM #11
回應時引用此文章
SGI離線中  
SGI
Major Member
 
SGI的大頭照
 

加入日期: Sep 2003
文章: 263
引用:
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]?

請給小弟點意見,謝謝
 
舊 2003-10-16, 10:06 AM #12
回應時引用此文章
SGI離線中  
harrisonlin
Advance Member
 
harrisonlin的大頭照
 

加入日期: Jun 2003
您的住址: Taipei
文章: 442
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++時,計概就是你實作的基礎了!
舊 2003-10-16, 11:04 AM #13
回應時引用此文章
harrisonlin離線中  
SGI
Major Member
 
SGI的大頭照
 

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

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

那如果值超過65535,那還會佔4 byte嗎?
舊 2003-10-16, 03:40 PM #14
回應時引用此文章
SGI離線中  
phonxe
Regular Member
 

加入日期: Aug 2002
您的住址: 台灣中部
文章: 86
引用:
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的關系可說是密不可分的。
舊 2003-10-16, 11:01 PM #15
回應時引用此文章
phonxe離線中  
SGI
Major Member
 
SGI的大頭照
 

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



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

----------------------------------------------------------------
原來如此...
這點我的書上就沒有寫了
看來指標一時要理解真的是不太容易呢
感謝您給我這麼重要的意見唷
以後仍請大大不吝賜教
舊 2003-10-17, 09:30 AM #16
回應時引用此文章
SGI離線中  
harrisonlin
Advance Member
 
harrisonlin的大頭照
 

加入日期: Jun 2003
您的住址: Taipei
文章: 442
引用:
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。其它的型別也是一樣!
舊 2003-10-17, 10:28 AM #17
回應時引用此文章
harrisonlin離線中  
SGI
Major Member
 
SGI的大頭照
 

加入日期: Sep 2003
文章: 263
引用:
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。其它的型別也是一樣!

--------------------------------------------------------------
另一端...?
呵呵,小弟我真的越聽越給它模糊下去了
看來不能再撐了
我還是先去找本計概再來和大大您討論吧
感謝大大不厭其煩地講解唷
舊 2003-10-17, 04:00 PM #18
回應時引用此文章
SGI離線中  


    回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是06:25 PM.


vBulletin Version 3.0.1
powered_by_vbulletin 2026。