這一偏距離上次說指標,時間是有點長了,主要是這幾天上班有點累。好了,今天恢復了一下,讓我們將繼續侃吧!
上一次我們提到了一般的變數,同時也說了指標變數。這樣的話我們應該認識到這兩種變數有什麼異同了吧。
什麼什麼,您還在迷糊,沒關係,讓我再來說一遍。
我們說定義了乙個變數實際上是分配的一定位元組的儲存空間,所以這個儲存空間就有他的首位址,首位址就是我們平常的指標常量,同時從首位址開始的若干個位元組也就成了我們定義變數的內容了。也就是說int a;a的位址&a是乙個指標常量(注意常量也就是不能變化的量),而這時我們又定義了乙個變數int* p;這時我們定義了乙個指標變數,p的位址&p是也是乙個指標常量(注意常量也就是不能變化的量),而p是乙個指標變數,這時的p的內容是乙個隨機的值,並未指向任何可確定的合法的位址,所以,訪問p的內容如另*p = 0;有極大的可能是;程式失控,因此一般的我們會讓p = &a;也就是把乙個確定的合法的指標常量賦予p這個指標變數。而&p在這裡我們是用不到的,這裡我們知道p的位址是沒有什麼用的。但是在有些情況,我們又定義了乙個int** pp;是就會有用了,這是,我們的變數pp是乙個指標變數,也分配4個位元組的儲存空間,不過他的型別是乙個整型指標的指標變數,也就是說pp的內容,要是&p的值才會沒有問題。而&p是乙個常量即是p的位址。依次類推的情況下&pp也是乙個常量,我們可以無休止的int*** p;這樣當然是可以的,但是卻從不同程度上加大我們理解程式的難度。
不知道你有沒有看到過這樣的定義, char* addr = (char*) 0xb800;
addr 這個字元指標變數就指向,乙個b800h處,如果是乙個應用程式,你可能永遠也不會用到它,可是作業系統之類的程式裡,就會是乙個經常用到的東西。
#include
int main(void)
上面的這段程式,之所以用這樣的形式,就是要說明指標的問題。
第一上面的這個程式不是一次得到的,我們先要執行#上面的,然後得到那個常量0x28ff3f,這樣我們就可以像上圖那樣為常量的*號的形式賦值,實際上就是為c賦值,因此我們列印出的字元變數c就是'$'。而這樣的形式對於初學指標或者是c的小朋友們可能就天書的感覺,也難怪,如果這是沒有指標的深入理解,看到的就是字元,絕對不會理解他的真意。
本來今天想說道這裡就行了,不過還是想多嘮叨幾句,那就是陣列。
如果我們這樣的定義了乙個陣列,char str[10],你是怎麼理解的呢?
好了不賣關子了,讓我們精確而深刻的分析一下吧,要是按照某些教科書上的說法的話,就僅僅是定義了乙個陣列,而且分配了10個位元組的儲存空間。是的這也沒什麼錯,不過如果是僅僅這樣簡單的描述的話,上學的同學們就會錯過好多回後,才恍然大悟,而那時候他們都可能已經非常地討厭c語言了。
我們怎麼解釋呢?
第一我們要看str是個什麼東西,str是變數嗎?它是變數嗎?是嗎?我不禁的問了3遍,當然是否定。
恰恰定義了乙個陣列後str是乙個位址的常量,它指向了陣列的開端。
那麼這時候變數在**?偏偏變數是str[0], str[1], str[2].... 等共10個
#include
int main(void)
上面這段程式會讓你對陣列,指標有乙個全新的理解,同時也讓你看到了c語言的靈活或者或者說是有點混亂,雖然的本意並不是炫耀,但是可能我內心還是要炫耀他,畢竟只有在很少c書中才會有人願意深刻的說說他。
好了今天就到這裡了,還是好好休息一下吧
關於指標,我對初學C語言的同窗們真的有話要說!2
昨天,我大膽地從不知道是什麼角度,泛泛地把指標的一些問題談了起來。今天,我們還是繼續再談談吧!在c中如果要說指標的話,其實更確切的說應該是定義的指標變數,那麼對應起來就是指標的常量,這兩者之間說起來還是挺好區分的。我們知道變數一定是分配儲存空間的,而常量是本來就存在的,那麼本質的區別在 呢?還是拿個...
關於C語言的指標
一級指標 指標是什麼?在電腦科學中,指標 pointer 是程式語言中的乙個物件,利用位址,它的值直接指向 points to 存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為 指標 意思是通過它能找到以它為位址的記憶體單元 指標...
關於C語言的指標
c語言指標 今天學習了指標,講講我對它的認識。這是乙個指標 int i int p scanf d i p i i是乙個整型變數,p是乙個指標,輸入時賦值給i,p是i的位址。就好比,i是房子的名字,p是房子的位址,輸入的值是放在房子裡的東西。符號 是取位址的意思,在這裡是對i取位址。定義指標的時候,...