1.CPU 訪問內存時需要的是地址蟆技,而不是變量名和函數(shù)名魄懂!變量名和函數(shù)名只是地址的一種助記符沿侈,當源文件被編譯和鏈接成可執(zhí)行程序后,它們都會被替換成地址市栗。編譯和鏈接過程的一項重要任務就是找到這些名稱所對應的地址缀拭。
#include <stdio.h>
int main(){
int a = 100;
char str[20] = "tanyusheng";
printf("%#X, %#X\\n", &a, str);
return 0;
}
2.需要注意的是,雖然變量名填帽、函數(shù)名蛛淋、字符串名和數(shù)組名在本質上是一樣的,它們都是地址的助記符篡腌,但在編寫代碼的過程中褐荷,我們認為變量名表示的是數(shù)據(jù)本身,而函數(shù)名嘹悼、字符串名和數(shù)組名表示的是代碼塊或數(shù)據(jù)塊的首地址叛甫。
定義指針變量的方式:
datetype *name;
datetype *name=value;
//定義普通變量
float a = 99.5, b = 10.6;
char c = \'@\', d = \'#\';
//定義指針變量
float *p1 = &a;
char *p2 = &c;
//修改指針變量的值
p1 = &b;
p2 = &d;
是一個特殊符號,表明一個變量是指針變量杨伙,定義 p1其监、p2 時必須帶。而給 p1限匣、p2 賦值時抖苦,因為已經知道了它是一個指針變量,就沒必要多此一舉再帶上米死,后邊可以像使用普通變量一樣來使用指針變量锌历。也就是說,定義指針變量時必須帶峦筒,給指針變量賦值時不能帶*辩涝。
4.通過指針變量取得數(shù)據(jù)
#include <stdio.h>
int main(){
int a = 15;
int *p = &a;
printf("%d, %d\\n", a, *p); //兩種方式都可以輸出a的值
return 0;
}
假設 a 的地址是 0X1000,p 指向 a 后勘天,p 本身的值也會變?yōu)?0X1000怔揩,p 表示獲取地址 0X1000 上的數(shù)據(jù),也即變量 a 的值脯丝。從運行結果看商膊,p 和 a 是等價的。
5.在不同從場景中含義不同宠进,定義指針變量時表示這是一個只能變量晕拆,與普通變量區(qū)分開來;獲取指針變量時前面加*表示獲取指針所指向是數(shù)據(jù),或者說表示指針指向數(shù)據(jù)發(fā)本身实幕。
6.給指針變量賦地址值時不能加*號