《C語言語法知識》 指標

2021-08-21 14:10:29 字數 1602 閱讀 6411

注:本文內容是學習小甲魚老師講解後的部分總結。

首先說明記憶體是如何存放變數的:

變數名的存在只是為了方便程式設計師使用而設計的,計算機記憶體中並沒有儲存變數名,變數名對應的是位址,只有編譯器知道。在編譯器編譯時,它會根據變數名所代表的位址找到對應位址,並根據變數的型別讀取相應範圍的資料。(記憶體的最小儲存單位為1個位元組)(int型變數佔4個位元組,float也是4個位元組,double是8個位元組)

通常我們所說的指標,就是位址的意思。c 語言中有專門的指標變數用於存放指標,跟普通變數不同,指標變數儲存的是乙個位址。它定義時的型別就是存放的位址所指向的資料的型別。

看圖,上邊我們又定義了兩個指標變數:pa 和 pb,因為它們是指標變數,所以它們在記憶體中存放的是位址。這裡我們分別存放了變數 a 和 f 的位址。在我們的編譯系統中,指標變數是佔 4 個位元組的空間,也就是說乙個位址是佔 4 個位元組的空間。(要注意這是針對32位機,64位機是8個位元組。在32位、64位系統當中,唯一改變的是指標的長度;在32位系統當中是4個位元組、64位則是8個位元組。所謂的32位、64位,這個指的是暫存器的位寬。)

char *pa = &a;

int*pb = &f;

如果需要訪問指標變數指向的資料,可以使用取值運算子(*):

printf("%c, %d\n", *pa, *pb);
這裡要注意的是取值運算子跟定義指標用的都是星號(*),這屬於符號的重用,在不同的地方有不同的意義:在定義時表示定義乙個指標變數;在其他位置表示獲取指標變數指向的變數的值。

直接通過變數名來訪問變數的值,我們稱之為直接訪問;通過指標變數這樣的形式來訪問變數的值,我們稱之為間接訪問,所以取值運算子有時候也叫間接運算子。

注意:要避免訪問未初始化的指標

#include 

int main()

類似於上邊這樣的**是很危險的,因為指標變數 a 到底指向**,我們沒辦法知道。這個道理就跟訪問未初始化的變數一樣,它的值是隨機的。

這在指標變數裡會很危險,因為後邊**對乙個未知位址進行賦值,那麼你可能會覆蓋到系統的一些關鍵**。不過你也別高興得太早,因為系統通常都不會允許你這麼幹,程式這時候會被終止並報錯。

更危險的是,偶爾這個指標變數裡隨機存放的是乙個合法的位址,那麼接下來的賦值就會導致那個位置的值莫名其妙地被修改。這種型別的 bug 是非常難以排查的。

所以,在對指標進行間接訪問時,必須確保它們已經被正確地初始化。

也就是說在我們定義完指標變數後,要給這個變數賦乙個位址,使其初始化。

為了更深入理解指標,請看以下例程:

#include 

int main()

該程式的執行結果如圖

C語言語法

printf 01f n double 2 1 printf 02f n double 2 1 保留兩位小數 陣列賦值 include memset al,0,sizeof al 輸入浮點數 while scanf lf n eof 字串比較 include char a 11 1234567890...

《C語言語法知識》 小知識點彙總

在使用 關係運算子時,為了避免會誤寫為賦值符號 而無法被檢測出錯誤,將值放在運算子左側,變數放在運算子右側,如if y value 這樣當誤寫時編譯器就會報錯。do while迴圈先執行迴圈體中的內容,然後判斷while後表示式的值,若為真,再次執行迴圈體,若為假,則跳出迴圈。注意 do while...

C語言語法基礎考試

c語言語法基礎考試 第2輪 學員姓名 試卷說明 1 本試卷共 25題,部分來自 intel 微軟 ti等公司的面試題,其餘出自平時基礎課程。2 本試卷主要目的是考查對 c語言本身的理解程式,而非演算法測試。3 所有題目均需相關說明,yes no 型回答均不得分。4 從實際專案開發的角度回答問題,切忌...