一、指標的基本知識
示例**:
#include int main(void)
輸出結果:
&hoge..0xbfbfd9e4
&piyo..0xbfbfd9e0
&hoge_p..0xbfbfd9dc
hoge_p..0xbfbfd9e4
*hoge_p..5
hoge..10
要 點:
1. 對變數使用&運算子, 可以取得該變數的位址。這個位址稱為指向該變數的指標。
2. 指標變數 hoge_p 儲存了指向其他變數的位址的情況下, 可以說「hoge_p 指向 hoge」。
3. 對指標變數運用*運算子, 就等同於它指向的變數。如果 hoge_p 指向 hoge, *hoge_p 就等同於 hoge。
一些要注意的點:
1. c語言混亂的宣告
int* hoge_p, piyo_p; 確實符合「型別 變數名;」的格式,但是有問題:
int* hoge_p, piyo_p; 等價於 int *hoge_p; int piyo_p;
2. 關於int main(void)
不推薦 void main(void) 的寫法,有返回值的main函式更優,返回0表示通知執行環境程式「正常結束」
二、指標和位址之間微妙的關係
指標就是位址?
/* ansi c 為我們準備了「可以指向任何型別的指標型別」—— void*型別 */
int hoge = 5;
void *hoge_p;
hoge_p = &hoge; /* 這裡不報錯 */
printf("%d\n", *hoge_p); /* 列印輸出hoge_p 指向的變數的值 */
/* 第7行會報錯,如果僅僅告之記憶體位址,
卻沒有告之在那個位址上儲存的資料型別,當然是不能取出值來的 */
printf("%d\n", *(int*)hoge_p); /* 將hoge_p強制轉換成int* */
/* 這裡通過將「所指型別不明的指標」hoge_p強制轉型成「指向int的指標」
來告之編譯器型別資訊,由此可以取出int型別的值。
但每次都這樣寫是比較繁瑣的,不妨事先寫成以下的宣告:
int *hoge_p; */
三、指標運算
示例**:
int main(void)
輸出結果:
hoge_p..0xbfbfd9e4 // 最初的值
hoge_p..0xbfbfd9e8 // 加1 後的值
hoge_p..0xbfbfd9f4 // 加1 之後再加3 的值
指標運算的特徵:
對指標進行加1運算,位址的值會增加當前指標所指向資料型別的長度
該例程中hoge_p是指向int的指標,而在作者的環境中int型別的長度為4,所以給位址加1,指標前進4個位元組
要點:對指標加 n,指標前進「當前指標指向的資料型別的長度×n」
C 讀書筆記 1
1 include 1 以 標誌開始的語句是預處理器的指示語句,不是可執行的語句,只是起到提醒編輯器下面要即將進行編譯 2 iostream是輸入 輸出流標準標頭檔案,相當於c語言中的stdio.h 2 using namespace std 1 此行代表的是標準命名庫空間,在此處宣告,便可以在下面...
C和C指標讀書筆記
1.c中變數的儲存型別 儲存型別分為靜態儲存 普通記憶體 堆疊,暫存器自動變數即 塊內部的變數儲存於堆疊,其他變數儲存於普通記憶體即靜態儲存,如果頻繁訪問乙個變數,宣告為暫存器型別後儲存於硬體暫存器中。2.c中實體的鏈結屬性 1 屬於internal鏈結屬性的識別符號在同乙個原始檔內的所有宣告中都指...
c 學習讀書筆記《1》
1.設定環境變數 path c windows microsoft.net framework v2.0.50727 2.helloworld.cs 第乙個程式 cmd csc helloworld.cs helloworld.exe namespace 可以巢狀 被引用時用 using a 但是當...