1樓:草迎風
以下是個人理解:
變數具有型別,而型別是編譯器用來分配儲存空間的模板,比如int型分配4個位元組,也就是分配了32位。所以,定義乙個變數並不代表分配了乙個空間,只是定義了乙個分配模板。
只有使用了已經定義的變數,才為其分配空間,如int i=0;
分配空間給所定義的變數和使用變數,兩個的本質是一樣的,並且分配了空間就是使用變數來儲存數值。而儲存了值的那個變數的空間是記憶體裡的儲存單元,所以變數在記憶體中有乙個位址,這個位址是隨機的,也只有使用變數時候才分配的。
其實,直接訪問變數就是直接訪問乙個位址,等價於訪問乙個指標,如果乙個變數裡儲存的值是另一位址,那麼就把這個變數當做指標!
本質上,指標和變數沒有任何區別,他們的區別在於:為指標分配的位址空間是固定的,如32位機器就分配32位,64位機器就分配64位;而為變數分配的位址空間是因不同約定的型別的不同而不同的,這裡說的是約定的型別,如int分配4個位元組,long int分配8個位元組,float分配4個位元組。
(以上的一些變數型別所佔的位元組是因為編譯平台和編譯機器不同而會有所區別,但現在的機器和平台幾乎都是如此的。)
2樓:
要想很好的理解去看看,編譯原理吧
人家在編譯的時候,要維護乙個符號表的
比如乙個變數,int a;
就有相應的 a這個符號對應的在記憶體中的偏移位址當你在使用這個符號的時候,在相應的指令直接就插入它的偏移位址
3樓:匿名使用者
把記憶體看成是乙個乙個的格仔
往記憶體中放資料就是往格仔裡放
每個格仔對應乙個編號
這個編號就叫做位址
所以通過位址可以確定格仔
也就是確定格仔裡的資料
而變數是有型別的
型別決定的是格仔的個數
比如int
那麼一般可以確定4個格仔
所以使用變數名,就相當於訪問這4個格仔
僅供參考 個人理解
4樓:欣夢魂
位址和指標是緊密相連的,首先值是放在記憶體中的乙個區域,而記憶體中的區域都會有不同的編號,這些編號可以認為就是位址。
例如:int* a是指標變數,int b=3,
a=b,則是錯誤的,此時a是不等於3的,因為a是指標變數,你不能把b的值賦給它。應該是
b的位址
a=&b,就是正確的,此時a存放的就是b的值在記憶體中的位址
如果你輸出printf(「%d」,a)與printf(「%d」,*a) 結果是不一樣
前者輸出的是b在記憶體中的位址,後者輸出的是指標a 指向b的位址的值(即b的值3)
5樓:匿名使用者
關於這個問題我也很困惑。我最不解的是到底位址和儲存空間哪個能訪問到值,書上這麼說的比如
int a=12,*p=&a,從這裡開始,看吧:*&a==a成立,並且&*p==p也成立。前者是指向a的位址的指標卻跟a本身等同了,指向位址的指標跟值有什麼關係呢?
後者是指標的位址跟p的位址等同了。p的位址是指標p的位址,p表示p儲存的位址是a的位址,兩者位址i怎麼能等同呢?
********************
根據書上的解釋,貌似儲存空間就是值。比如int a=12,那麼變數a的儲存空間就是a,也就是12.這個可能要看看關於變數的定義了。
********************
更正一下這個答案。任何變數,都是乙個代表,所代表的東西在cpu裡,就是位址和值兩個東西。當*(指標符號)加在變數前面的時候,就代表了對變數(此時變數代表乙個位址)取值;當&(位址符號)加在變數前面的時候,就代表了對變數(此時變數代表乙個值)取位址。
在c語言中如何列印變數的位址?
6樓:翠寒煙
需要定義指標變數才能輸出變數的位址
舉個簡單的裡自來說:
#include "stdio.h"
void main()
執行程式即可看到變數a和變數b在記憶體中分配的位址
7樓:格瓦斯博卡拉
cahr * a =null;
a = malloc(10);
printf("%d\n",a);
指標裡面的值就是位址,明白指標就知道位址了。尋常位址指棧位址。其他位址無意義
8樓:
列印時加&就行啊。
int a,b;
printf(「%d,%d」,&a,&b);//讀取位址
c語言關於取值和取址
9樓:yty隨意
1、首先開啟visual c++,點選左上角「檔案」選單按鈕,並點選「新建」按鈕。在彈出的視窗中首先選擇「檔案」選項卡,在左側列表中選取「c++ source file」項。
2、在右側檔名文字框中輸入檔名,如「demo」等。
3、然後按照**輸入演示**。
4、**執行:按照箭頭標識的順序,依次點選箭頭所指向的按鈕。
5、按下最後乙個按鈕成功後會彈出圖所示黑色窗體,窗體中顯示程式執行結果,並得出正確數值。
10樓:
指標和任何變數一樣就是一容器,不過他裝的是位址。而這位址一般都指向另乙個變數或者一塊資料。
當然你也可以用取值符號(*)取任何變數,程式就會自動吧這個變數內的資料作為位址去獲取,這個位址的資料,這樣是非常危險,容易造成溢位或者任何不可預知的災難。
任何變數都是放在記憶體中的,取址符號(&)就是獲得他們在記憶體中位址,記得指標也是以變數,沒有任何特殊,就看你怎麼使用它,你把它當指標就是指標,當普通變數就是普通變數。
#include "stdio.h"
main()
11樓:手機使用者
0是常量
a和*p表示的都是整形左值,p和&a表示的都是指標型左值,1和0x1000表示整形和指標型右值。(左右值的概念不清的話,google一下)
在記憶體中,a和p有儲存空間空間,a存放著1,p存放著0x1000,*p和&a沒有空間,他們的運算結果是在暫存器中存放的,1和0x1000也有空間,在程式的常量段存放。
*p按照stanley lippman的著作《c++ primer》中的描述,p是指標變數,*是解引用操作符,*p是乙個表示式,含義是「對指標變數p進行解引用操作」,這與表示式&a的含義「取整形變數a的位址」是正好是相反的操作。
12樓:尋平陽
int a,c;
int *b;
a=1;
b=&a; //取a的位址
c=*b; //取b指向的值,即a;
如何在c語言中定義乙個變數在乙個絕對位址
13樓:
c中的「變數」用識別符號表示,叫「變數名」;變數名的管理有一套對程式設計者透明的機制,所以不能將變數定義在乙個程式設計師主觀想像的地方。但指標變數例外,因為指標變數的值是位址值,所以可以將乙個具體數值強制為同型別指標再賦給指標變數,如int *p=(int *)1234567;,這就把1234567這個位址值賦給指標變數p了——但這是很危險的操作,不僅不提倡,通常是禁止的,只是語法上合法。
c語言中位址數值和普通數值有什麼區別?
14樓:
比如說你叫a,也就是1506,你所住的位址就是0x1000(這個是16進製制的數值),而另乙個p所記錄的就是你的位址,方便找到你
a是值&a是你的位址
int *p是定義乙個指標變數p
p代表位址指標
*p代表p指標所指向a的值,也就是1506
15樓:
你才學沒多久嗎?
多多練習就知道怎麼回事了。
int是整形變數,a是變數名。1000是給變數a賦值。
*p是乙個整形指標變數名,指標賦值要用&取位址操作。或者直接用另外乙個指標變數賦值
c語言中變數的位址是什麼型別的
16樓:風若遠去何人留
變數的位址,在c語言中,一般寫作指標型別。
不同型別的變數位址,用不同的指標進行儲存。
比如,char 型別的位址,使用char*儲存,而int型位址,用int *儲存。
除此外,部分情況下也會採用整型型別來儲存變數位址,具體使用何種整型型別,取決於編譯器:
1 16位編譯器,位址佔16位,2位元組,可以使用short或者int儲存。
2 32位編譯器,位址佔32位,4位元組,可以使用int或long儲存。
3 64位編譯器,位址佔64位,8位元組,可以使用long儲存。
不過不推薦使用整型型別儲存位址,會帶來移植上的不通用。
17樓:千鋒教育
變數的位址是根據資料型別決定的。
比如:int是4個位元組的位址空間,每種資料型別佔用的位元組數是不同的。
它是物件位址空間的首位址,表示這個指標引用的物件在記憶體中的起始位置;另一元是物件的型別,它是物件位址的關聯的資料型別,表示這個指標引用的物件在記憶體中佔用的位址空間的大小。位址在計算機中由乙個數字表示,在32位系統中是4個位元組的整數,64位系統中是8個位元組的整數。物件的指標在表示式中做為左值時引用的是物件本身,作為右值時引用的是物件的值。
關於堆疊和變數儲存,c語言裡什麼變數儲存在堆中什麼變數儲存在棧中啊!
1.c語言中的堆疊是一種資料結構,它表示按照規定強制要求按fifo或filo的方式進行資料讀寫,是軟體層面的意義,你需要定義pop push的具體操作。而微控制器中的堆疊是硬體層面的意義,其實現是通過硬體電路實現的,push pop操作時固定的,你無法改變 2.微控制器分為兩種,哈佛體系和普林斯頓體...
c語言執行以下程式段後變數a的值是
條件a b a b a a是這樣執行的,a b 3,a 先判斷在自增,判斷為0,自增後為1,因為判斷為0,所以邏輯短路,後面的也就不判斷了 switch裡面是0,所以case 0執行成功,也就是說從case 0後面的語句都要執行,知道遇到break a case 1 b case 2 a b 也就是...
指標「變數裡面的值」和「指標位址的值」和「指標指向的值」有什麼區別
一 結果不同 例如 int i 1 假設i的位址為100,實際位址不是這樣的。int p i 假設指標p的位址 p為200 指標變是的值也就是指標的值p,也就是變數i的位址,即100,也就是說p 100,而指標指向的值,指的是指標所指向的位址100這個記憶體位置,所對應的值,也就是i的值,為1。二 ...