c語言變數的地址
『壹』 關於c語言的 變數 地址 和 值
以下是個人理解:
變數具有類型,而類型是編譯器用來分配存儲空間的模板,比如int型分配4個位元組,也就是分配了32位。所以,定義一個變數並不代表分配了一個空間,只是定義了一個分配模板。
只有使用了已經定義的變數,才為其分配空間,如int i=0;
分配空間給所定義的變數和使用變數,兩個的本質是一樣的,並且分配了空間就是使用變數來存儲數值。而存儲了值的那個變數的空間是內存里的存儲單元,所以變數在內存中有一個地址,這個地址是隨機的,也只有使用變數時候才分配的。
其實,直接訪問變數就是直接訪問一個地址,等價於訪問一個指針,如果一個變數里存儲的值是另一地址,那麼就把這個變數當做指針!
本質上,指針和變數沒有任何區別,他們的區別在於:為指針分配的地址空間是固定的,如32位機器就分配32位,64位機器就分配64位;而為變數分配的地址空間是因不同約定的類型的不同而不同的,這里說的是約定的類型,如int分配4個位元組,long int分配8個位元組,float分配4個位元組。
(以上的一些變數類型所佔的位元組是因為編譯平台和編譯機器不同而會有所區別,但現在的機器和平台幾乎都是如此的。)
『貳』 關於C語言字元變數的地址
因為你這個a是字元數組,a相對於指針,但是a不能賦新值,比如:
#include <stdio.h>
int main()
{
char a[100];
scanf("%c",a);
*a=65;//允許像指針一樣操作
*(a+1)=0;
//a++; 但不可以和指針那樣遞增賦新值
printf(a);
return 0;
}
綜上,a相對於指針,但不完全是指針,所以scanf中對於a是不必&求地址。
如果是:
char a;
scanf("%c",a);//則是錯誤的,因為這里的a是字元,則會把a的值當著scanf參數,而非a的地址。
『叄』 如何在c語言中定義一個變數在一個絕對地址
C中的「變數」用標識符表示,叫「變數名」;變數名的管理有一套對編程者透明的機制,所以不能將變數定義在一個程序員主觀想像的地方。但指針變數例外,因為指針變數的值是地址值,所以可以將一個具體數值強制為同類型指針再賦給指針變數,如int *p=(int *)1234567;,這就把1234567這個地址值賦給指針變數p了——但這是很危險的操作,不僅不提倡,通常是禁止的,只是語法上合法。
『肆』 在c語言中給一個變數賦值與賦地址的區別
1、傳遞的變數值不同
兩者其實傳遞的都是一個內存單元的內容。不同的是,值傳遞的內容是一個變數的值,得到這個值後,對這個值得修改不能改變原變數的值;而地址傳遞的是一個變數的地址,得到傳遞的地址值後,可以通過這個地址直接訪問地址對應的那個變數,進而修改那個變數的值。
2、傳遞的途徑不同
值傳遞只是將變數的內容復制一份而已,函數進行操作的其實是另一個變數,只是另一個變數的值和傳遞的變。賦地址相當於間接操作就相當於知道了這間房子的具體位置去找裡面的主人而賦值是直接去根據主人名字去找它。
3、傳遞的函數不同
賦地址inta=10,b;給變數賦值就是b=a;但是賦地址就不行因為地址只能賦給指針變數應在上面基礎上加char*p;把a的地址給p就是p=&a;地址只能存在指針變數中變數賦值,是可以給變數賦一個相同類型的任意的數據,而變數的地址是系統在內存隨機分配的,不能更改。並且只有指針變數才能賦地址值。
給變數賦地址這個變數要為指針變數int*p,b;*p=&b;給變數賦值只要類型相同就行。其實都是一樣,都是給一個數據,地址也是一個數值而已給變數賦值是復制一個數如:inta=1b;b=a;則變數b被賦值為a的值,但是賦地址得用指針,因為指針的定義就是地址的意思。