1樓:小林子
記憶體地址這個概念
打個比方:整個記憶體就相當於一個擁有很多房間的大樓,每個房間都有房間號,比如從 101、102、103 一直到 nnn,我們可以說這些房間號就是房間的地址。相對應的記憶體中的每個單元也都有自己的編號,比如從0x00、0x01、0x02 一直到 0xnn,我們同樣可以說這些編號就是記憶體單元的地址。
房間裡可以住人,對應的記憶體單元裡就可以「住進」變數了:假如一位名字叫 a 的人住在 101 房間,我們可以說 a 的住址就是 101,或者 101 就是 a 的住址;對應的,假如一個名為 x 的變數住在編號為 0x00 的這個記憶體單元中,那麼我們可以說變數 x 的記憶體地址就是 0x00,或者 0x00就是變數 x 的地址。
基本的記憶體單元是位元組,英文單詞為 byte,我們所使用的 stc89c52 微控制器共有 512 位元組的 ram,就是我們所謂的記憶體,但它分為內部 256 位元組和外部 256 位元組,我們僅以內部的 256 位元組為例,很明顯其地址的編號從 0 開始就是 0x00~0xff。我們用 c 語言定義的各種變數就存在 0x00~0xff 的地址範圍內,而不同型別的變數會佔用不同數量的記憶體單元,即位元組,可以結合前面講過的 c 語言變數型別深入理解
2樓:幻の上帝
c語言本身沒有「地址」的概念。地址是語言實現中涉及到的內容。如果學過計算機組成原理或者組合語言就會知道儲存器中構造出一個連續的整數集合作為地址空間(通常不是實體地址空間, 生命行者2010 錯誤),而地址是其中的一個整數。
一個地址標識一個儲存器單元(可以儲存一個位元組),通過不同的地址就可以訪問不同的儲存器單元。
c語言中,變數是儲存數值的一種物件。c語言的編譯器把變數繫結到地址空間中,只要知道變數的(首)地址就可以標識這個變數。變數的物件語義要求變數的值能在程式執行期在儲存器中的確定位置能夠被找到,因此一個變數在確定的生存期中具有且只有一個地址。
而變數的值在實現上則是指儲存這個變數的一個或多個具有連續地址的儲存器單元中儲存的值(至於那個儲存器單元儲存哪個部分,涉及到位元組序問題,和語言本身無關,初學者無需關心)。(seven_qj錯誤,c語言的變數可以儲存在cpu的暫存器(和實體記憶體、虛擬記憶體被對映在同一個地址空間)中(定義暫存器變數時通過register儲存類限定符修飾),而不一定是記憶體中。)
ps1.在32位平臺上,地址空間的大小是2^32位元組,可以用一個32位整數表示。
2.c語言中的指標(變數)就是提供了指標運算規則、型別檢查的一種特殊的整數變數。
3.c語言中單目運算子&作用於一個物件時,返回指向這個物件的指標。
4.舉例:
int a = 1;/*定義了一個變數a。*/
int *ptr=&a;/*定義了一個指向int變數的指標ptr,它的值被初始化為表示式&a的值,也就是a的地址*/
/*如果ptr的值是0x12345678,那麼就表示a的地址是0x12345678。通過p可以間接訪問a所在的儲存器單元,從而對a進行間接操作。*/
/*話說0xffffffff也太扯淡了點- -...*/
3樓:匿名使用者
變數的地址就是變數的編號,和每個大樓的房間號一樣,房間號是地址,裡面存放的是內容,也就是變數的值了,不知道這麼解釋你能理解不?建議你看下彙編,再學c的地址就簡單了
4樓:
地址就是變數在記憶體中存放的位置。例如32位機上記憶體形式可以為:0xffffffff。
例如:int a=1;
int *ptr=&a;
假設變數a的地址為0xffffffff,那麼p的值就是ffffffff。
5樓:生命行者
變數指的是資料
地址指的是此資料的物理位置
例:變數a的地址是「某柱面某扇區某磁軌」
c語言中「指標」和「指標變數」的區別是什麼??
6樓:大野瘦子
1、概念不同
「指標」是概念,「指標變數」是具體實現,指標也是一個變數,所以需要進行定義,而對於指標的定義,與一般變數一樣。
2、 存放地址不同
一個變數的(記憶體)地址稱為該變數的「指標」,通過指標能找到以它為地址的記憶體單元。而指標變數是用來存放另一個變數的地址的(即指標)。
指標和指標變數的關係
1、指標就是地址,地址就是指標。
2、地址就是記憶體單元的編號。
3、指標變數就是存放記憶體地址的變數。
4、指標和指標變數是兩個不同的概念,但要注意的是,通常我們敘述時會把指標變數簡稱為指標,實際他們含義並不一樣。
注:指標裡存的是100. 指標:地址 - 具體。
指標裡存的是地址,指標:指標變數 -可變。
指標的好處:
1、直接訪問硬體
2、快速傳遞資料(指標表示地址)
3、返回一個以上的值返回一個(陣列或者結構體的指標)4、表示複雜的資料結構(結構體)
5、方便處理字串
6、指標有助於理解物件導向
7樓:蓋辜苟
用例子來看一下。
int a=3;
int *p;
p=&a;
現在來看一下。a=3這個式子先解釋一下
等式右邊是常量,左邊是變數。
同理的p=&a,左邊的是指標變數,右邊的是指標
指標的基本概念:為了區別記憶體的不同位置,記憶體被分成位元組,記憶體的全部位元組順序地賦予一個稱為地址的編號。程式中的變數將在記憶體中佔據一定的記憶體位元組,在這些位元組中儲存的資料資訊稱為變數的內容。
一個變數佔用連續的若干個記憶體位元組時,最前面的一個位元組的地址就作為該變數的地址。指標就是記憶體地址,是變數的地址,或函式的入口地址。變數的地址在程式執行時,起著非常重要的作用。
當計算機在計算含有變數的表示式時,計算機按變數的地址取出其內容,並按變數的地址將計算結果存入到變數佔據的記憶體中。
如**: int x=l; x=x+2; 其中語句「x=x+2;」中的第一個x涉及到變數x佔據的記憶體,第二個 x是引用變數 x的內容。該語句的意義是「取x的內容,完成加上2的計算,並將計算結果存入變數x佔據的記憶體中。
」指標變數和它所指向的變數:在c語言中,地址也作為一種值,能被儲存、比較、賦值,並稱地址資料為指標型別,而稱儲存地址值的變數為指標變數,簡稱指標。c程式可用運算子&取變數的地址,如表示式&x的值就是變數x的地址。
程式除能按名引用變數外,也可利用變數的地址引用變數。按變數名引用變數稱為直接引用,而將變數a的地址存於另一變數b中,藉助於變數b引用變數a稱為對a的間接引用。
定義指標變數的一般形式為: 型別 * 指標變數名; 或 型別 * 指標變數名=初值表示式; 其中,指標變數名是識別符號,指標變數名之前的符號「*」,表示該變數是指標型別的。而最前面的「型別」,表示該指標變數能指向變數或函式的型別。
初值表示式是一個地址表示式,如表示式中有某變數的地址表示式,則這個變數應是前面已定義的。
在c語言中,當定義區域性指標變數時,如未給它指定初值,則其值是不確定的。程式在使用它們時,應首先給它們賦值。誤用其值不確定的指標變數間接引用其它變數,會引起意想不到的錯誤。
為明確表示指標變數不指向任何變數,在c語言中用0值表示這種情況,記為null。
如 ip= null; 也稱指標值為0的指標變數為空指標。對於靜態的指標變數,如在定義時未給它指定初值,系統自動給它指定初值0。
指標變數取程式物件的(開始)地址值,不能將一個整型量或任何其它非地址值賦給一個指標變數。另外,指標變數對所指向的物件也有型別限制,不能將一個不能指向的物件的地址賦給指標變數。
如有以下定義: int i=100,j,*ip,*intpt; float f,*fp; 以下**如註釋所敘。 ip=&i;/*使ip指向i*/ intpt=ip;/*使intpt指向ip所指變數*/ fp= &f;/*使fp指向正*/ ip=null;/*使 ip不再指向任何變數*/
在電腦科學中,指標(pointer)是程式語言中的一個物件,利用地址,它的值直接指向(points to)存在電腦儲存器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。因此,將地址形象化的稱為"指標"。
意思是通過它能找到以它為地址的記憶體單元。 在高階語言中,指標有效地取代了在低階語言,如組合語言與機器碼,直接使用通用暫存器的地方,但它可能只適用於合法地址之中。指標參考了儲存器中某個地址,通過被稱為反參考指標的動作,可以取出在那個地址中儲存的值。
作個比喻,假設將電腦儲存器當成一本書,一張內容記錄了某個頁碼加上行號的便利貼,可以被當成是一個指向特定頁面的指標;根據便利貼上面的頁碼與行號,翻到那個頁面,把那個頁面的那一行文字讀出來,就相當於是對這個指標進行反參考的動作。
指標是程式設計語言的一個重要概念。指標在c程式中有以下多方面的作用:
利用指標能間接引用它所指的物件。
利用各種型別的指標形式引數,能使函式增加描述能力。
指標與陣列結合,使引用陣列元素的形式更加多樣、訪問陣列元素的手段更加靈活。
指標能用來描述資料和資料之間的關係,以便構造複雜的資料結構。當一個資料a要關聯另一個資料b時,在資料a中增加一個指向資料b的指標就可實現資料a關聯資料b。結合系統提供的動態分配儲存設施,又能構造出各種動態資料結構。
8樓:
比較嚴格的說法是這樣的:
系統為每一個記憶體單元分配一個地址值,c/c++把這個地址值稱為「指標」。如有int i=5;,存放變數i的記憶體單元的編號(地址)&i被稱為指標。
「指標變數」則是存放前述「地址值」的變數,也可以表述為,「指標變數」是存放變數所佔記憶體空間「首地址」的變數(因為一個變數通常要佔用連續的多個位元組空間)。比如在int i=5;後有一句int *p=&i;,就把i的指標&i賦給了int *型指標變數p,也就是說p中存入著&i。所以說指標變數是存放指標的變數。
有一個事實值得注意,那就是有不少資料和教科書並沒有如上區分,而是認為「指標是指標變數的簡稱」,如對int *p=&i;的解釋是:宣告一個int *型指標p,並用變數i的地址初始化;而嚴格說應該是宣告一個int *型指標變數p才對。所以有時看書要根據上下文理解實質,而不能過於拘泥於文字表述。
已知地址塊中的地址是140 120 84 24 20試求相當於多少c類地址怎麼算啊
16個。2 12 2 8 2 4 16 一般要加上你當時的上網的環境而定 已知某地址塊中的一個地址是140.120.84.24 20 20 140.120.84.24因為20位字首因此不用轉換前兩個位元組140.120,轉換第三個位元組即可得到140.120.0101 0100 24 紅色下劃線部分...
已知地址塊中的地址是14012084X
最小地址為140.120.80.1 最大地址為140.120.95.254 地址掩碼是255.255.240.0 地址塊中共有2 12 4096個地址 已知地址塊中的一個地址140.120.82.24 20,試求這個地址塊中的最小地址和最大地址。地址 也就是說,子網掩碼有20位 255.255.24...
如何區別地址是單播地址,什麼是組播地址和單播地址?怎麼劃分?
172.31.128.255的二進位制是10101100.00011111.10000000.11111111,其網路號為18位,即是10101100.00011111.10所以其主機地址是000000.11111111.它既不是全0的,也不是全1的主機地址.所以是單播地址.或ip網路的多播一般通過...