該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
int a=10;
以上一句話對變量a進行了聲明,定義以及初始化
extern int a;
以上一句話僅僅對變量a進行了聲明,將a的鏈接屬性設置為external
int *p;
以上定義了一個指針
int a=10;
int *p;
p=&a;
以上為指針變量進行了賦值
說明:
首先*操作符被稱為“間接訪問操作符”也叫“解引用操作符”,他的作用很簡單,就是對它的右操作數進行解引用,這么說吧,間接訪問操作符的右操作數是一個地址,不過這里的地址只是相當于一個字符串,并沒有真正的在計算機內存中標識一個位置,只有對這個操作數進行解引用,才能真正定位到計算機的內存中相應的地址上;接下來是&操作符,這個被稱作“取地址操作符”,首先要明確,指針變量中存儲的不是一個具體的數值,他存儲的是一個地址“字符串”,p=&a,是將a的地址放入到p這個指針變量中,補充一句,在C語言中指針變量一般占有4個字節的內存
int *p=12;
以上表達式是錯誤的,千萬不要在實際編程中進行使用,可能有些編譯器不會報錯,但不代表所有編譯器不報錯,但即使不報錯也不要這么使用
說明:
首先該表達式給絕大多數初學者的印象是給指針p所指向的內存位置賦上值12,但是我們要注意了這里僅僅是對指針變量進行了聲明以及定義,也就是說編譯器僅僅在內存中替指針變量p分配了4個字節的內存,而并沒有位指針變量p所指向的位置分配內存,也就是說int *p=12這個表達式的意義是未明確的,因為12這個值得具體存放位置編譯器并不知道,筆者檢測過,在MinGW(gcc在windows下的移植工具集)中,這樣寫僅僅是報“警告”,但這樣寫是錯誤的,所以絕對不要這么寫
int a=12;
int (int *)1000=&a;
以上是為常量指針進行初始化,但是在C編程中我們可以說是絕無可能遇到這種情況,因為C語言中內存的分配并不是固定的
int a=100;
int *p=&a;
*++p;
看到以上表達式很多初學者就要困惑了,因為前綴自增操作符的優先級要高于間接訪問操作符的優先級,那對于*++p;這個表達式而言是不是就應該后執行間接訪問操作符呢?這里筆者糾正一下,如果是兩個操作符同時具有相應的操作數,那么就遵循操作符的優先級來進行運算,但是這里的*++p;這樣的表達式,我們看到只有一個操作數,而間接訪問操作符和前綴自增操作符都是自右右左的結合性,所以這里先執行自增操作,也就是將指針變量p所存儲的地址加1,之后再進行解引用,定位到具體的內存中,這里假設自增前p的地址是201,那么自增后再解引用,就會定位到202這個內存上
int a=100;
int *p=&a;
*p++;
看了上面的解說后,一般的初學者看了*p++;這樣的表達式,大概會興奮的說,這里必然是后綴自增先執行,哈哈哈,筆者在這里要大笑三聲然后自罰三杯,因為筆者以上并沒有說清自增的特性,現在這里說說后綴自增吧,在*p++;中后綴自增操作符會優先產生p的一個副本,然后解引用操作符會作用到這個副本上并返回值,這之后自增運算符才會在原有的p上執行加1的操作;我們再來說一說*++p;這個表達式,首先前綴自增會優先在p上執行加1的操作,然后產生一個p的副本,最后解引用操作符會對增1過后的副本進行解引用,從而得到相應位置的值