網域名稱俱樂部

網域名稱俱樂部 (https://www.domainclub.org/index.php)
-   一般軟體與網路使用討論 (https://www.domainclub.org/forumdisplay.php?f=43)
-   -   有關C語言的指標 (https://www.domainclub.org/showthread.php?t=36642)

哈啦 2014-05-28 04:07 PM

有關C語言的指標
 
有關指標,我想打個比方來說,請教一下各位先進,這樣理解是否正確?

int *x;
int &y;

在這裡我們用儲物箱來比喻記憶體(內存)。

&y就是指例如第幾號的箱子,而*x則是指第幾號箱子裡的東西是什麼?

這樣比喻對嗎?

再來,int 的屬性是表示已預先留了 4 byte的記憶體空間給 x or y,是嗎?例如一個箱子代表一個byte,int *x 是表示我已留了四個箱子給x,將來等它指定給某位址的陣列後(即幾號到幾號的儲物箱),會將某陣列裡面的內容copy一份出來放進x的箱子裡。還是根本沒有,x只是告訴你將來要去某個位址的記憶體(箱子)去用裡面的內容?x本身不占用任何箱子?

而假設
char *x;
char string[]="hello world!";
x=string;
請問,此時x裡是什麼東西?

希望我說的話大家能看懂我想表達的東西~embarass:

thanks

yumi 2014-05-28 08:21 PM

int *x;(x是指向int变量的指针变量,就是门牌号;*x是x变量所指的存储单元)
int y;
&y(这个是指针变量y的地址,就像门牌号)
也可以理解为:x(&y)就是指例如第幾號的箱子的号码,而*x則是指第幾號箱子裡的東西是什麼
x=&y就把y的地址赋给x了,*x里就是y的值了。

int 的屬性是表示已預先留了 4 byte的記憶體空間給 x or y,是嗎
只是规定可以指向int变量的单元,但开始并不指向任何实际单元,只有赋值(例如x=&y)后才指向实际单元。

而假設
char *x;
char string[]="hello world!";
x=string;
請問,此時x裡是什麼東西?
此时x里是"hello world!"的地址,就是门牌号

哈啦 2014-05-28 08:29 PM

引用:

作者: yumi (文章 192165)
請問,此時x裡是什麼東西?
此时x里是"hello world!"的地址,就是门牌号

:bow

:bow

many thanks!

哈啦 2014-06-10 06:13 PM

似乎有點搞懂了,試說理解如下:
int *x,
char *y;
float *z;

它們所代表的意義就是,編譯器在看到 int *x之後會知道這是一個「指向」一個占有四位元的整數的指標,之所以要讓編譯器知道占幾位元是因為,假設*p指向第一個位址是001234(我這裡的位址是隨便說的,先當成是十位數的好了。),那麼一直到001237的記憶體中的內容就是應該存取的內容。
如果是char *y,那麼編譯器就會從y指到的第一個位址,假設是001000,再加一個位元001001,這裡面的內容是該變數的內容。

這就是為什麼使用指標時,前面也得先定個型別(型態),那是因為指標事實上都只指到第一個位址,後面要取多少憶體的內容得靠前面的型別宣告來確定。

是這樣嗎?


但純以 int *x來說,請問x本身有沒有用到記憶體?如果有用到,是配多少給它?據我google的初步結果,指標占的大小是一樣的,但和作業系統是32 or 64 bits有關。

thanks

yumi 2014-06-10 08:25 PM

x本身当然占用记忆体,如果是32位系统,一般占用4字节;如果是64位系统,通常占用8字节。

哈啦 2014-06-10 08:27 PM

引用:

作者: yumi (文章 192466)
x本身当然占用记忆体,如果是32位系统,一般占用4字节;如果是64位系统,通常占用8字节。

~yes 謝謝。:bow


所有時間均為 +8。現在的時間是 02:15 PM

Powered by vBulletin® 版本 3.8.4
版權所有 ©2000 - 2024,Jelsoft Enterprises Ltd.