为什么c语言要定义变量,C语言为什么要规定对所用到的变量要“先定义,后使用”...
該樓層疑似違規(guī)已被系統(tǒng)折疊?隱藏此樓查看此樓
int a=10;
以上一句話對變量a進(jìn)行了聲明,定義以及初始化
extern int a;
以上一句話僅僅對變量a進(jìn)行了聲明,將a的鏈接屬性設(shè)置為external
int *p;
以上定義了一個指針
int a=10;
int *p;
p=&a;
以上為指針變量進(jìn)行了賦值
說明:
首先*操作符被稱為“間接訪問操作符”也叫“解引用操作符”,他的作用很簡單,就是對它的右操作數(shù)進(jìn)行解引用,這么說吧,間接訪問操作符的右操作數(shù)是一個地址,不過這里的地址只是相當(dāng)于一個字符串,并沒有真正的在計(jì)算機(jī)內(nèi)存中標(biāo)識一個位置,只有對這個操作數(shù)進(jìn)行解引用,才能真正定位到計(jì)算機(jī)的內(nèi)存中相應(yīng)的地址上;接下來是&操作符,這個被稱作“取地址操作符”,首先要明確,指針變量中存儲的不是一個具體的數(shù)值,他存儲的是一個地址“字符串”,p=&a,是將a的地址放入到p這個指針變量中,補(bǔ)充一句,在C語言中指針變量一般占有4個字節(jié)的內(nèi)存
int *p=12;
以上表達(dá)式是錯誤的,千萬不要在實(shí)際編程中進(jìn)行使用,可能有些編譯器不會報(bào)錯,但不代表所有編譯器不報(bào)錯,但即使不報(bào)錯也不要這么使用
說明:
首先該表達(dá)式給絕大多數(shù)初學(xué)者的印象是給指針p所指向的內(nèi)存位置賦上值12,但是我們要注意了這里僅僅是對指針變量進(jìn)行了聲明以及定義,也就是說編譯器僅僅在內(nèi)存中替指針變量p分配了4個字節(jié)的內(nèi)存,而并沒有位指針變量p所指向的位置分配內(nèi)存,也就是說int *p=12這個表達(dá)式的意義是未明確的,因?yàn)?2這個值得具體存放位置編譯器并不知道,筆者檢測過,在MinGW(gcc在windows下的移植工具集)中,這樣寫僅僅是報(bào)“警告”,但這樣寫是錯誤的,所以絕對不要這么寫
int a=12;
int (int *)1000=&a;
以上是為常量指針進(jìn)行初始化,但是在C編程中我們可以說是絕無可能遇到這種情況,因?yàn)镃語言中內(nèi)存的分配并不是固定的
int a=100;
int *p=&a;
*++p;
看到以上表達(dá)式很多初學(xué)者就要困惑了,因?yàn)榍熬Y自增操作符的優(yōu)先級要高于間接訪問操作符的優(yōu)先級,那對于*++p;這個表達(dá)式而言是不是就應(yīng)該后執(zhí)行間接訪問操作符呢?這里筆者糾正一下,如果是兩個操作符同時具有相應(yīng)的操作數(shù),那么就遵循操作符的優(yōu)先級來進(jìn)行運(yùn)算,但是這里的*++p;這樣的表達(dá)式,我們看到只有一個操作數(shù),而間接訪問操作符和前綴自增操作符都是自右右左的結(jié)合性,所以這里先執(zhí)行自增操作,也就是將指針變量p所存儲的地址加1,之后再進(jìn)行解引用,定位到具體的內(nèi)存中,這里假設(shè)自增前p的地址是201,那么自增后再解引用,就會定位到202這個內(nèi)存上
int a=100;
int *p=&a;
*p++;
看了上面的解說后,一般的初學(xué)者看了*p++;這樣的表達(dá)式,大概會興奮的說,這里必然是后綴自增先執(zhí)行,哈哈哈,筆者在這里要大笑三聲然后自罰三杯,因?yàn)楣P者以上并沒有說清自增的特性,現(xiàn)在這里說說后綴自增吧,在*p++;中后綴自增操作符會優(yōu)先產(chǎn)生p的一個副本,然后解引用操作符會作用到這個副本上并返回值,這之后自增運(yùn)算符才會在原有的p上執(zhí)行加1的操作;我們再來說一說*++p;這個表達(dá)式,首先前綴自增會優(yōu)先在p上執(zhí)行加1的操作,然后產(chǎn)生一個p的副本,最后解引用操作符會對增1過后的副本進(jìn)行解引用,從而得到相應(yīng)位置的值
總結(jié)
以上是生活随笔為你收集整理的为什么c语言要定义变量,C语言为什么要规定对所用到的变量要“先定义,后使用”...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言游戏注入dll能干什么,教大家写一
- 下一篇: c语言编译及下载环境变量,windows