《征服C指標》——讀書筆記(1)
阿新 • • 發佈:2019-01-01
一、指標的基本知識
示例程式碼:
輸出結果:#include <stdio.h> int main(void) { int hoge = 5; int piyo = 10; int *hoge_p; /*輸出每個變數的地址*/ printf("&hoge..%p\n", &hoge); printf("&piyo..%p\n", &piyo); printf("&hoge_p..%p\n", &hoge_p); /*將hoge 的地址賦予hoge_p*/ hoge_p = &hoge; printf("hoge_p..%p\n", hoge_p); /*通過hoge_p 輸出hoge 的內容*/ printf("*hoge_p..%d\n", *hoge_p); /通過hoge_p 修改hoge 的內容*/ *hoge_p = 10; printf("hoge..%d\n", hoge); return 0; }
&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)
{
int hoge;
int *hoge_p;
hoge_p = &hoge;
printf("hoge_p..%p\n", hoge_p);
hoge_p++;
printf("hoge_p..%p\n", hoge_p);
printf("hoge_p..%p\n", hoge_p + 3);
return 0;
}
輸出結果:
hoge_p..0xbfbfd9e4 // 最初的值
hoge_p..0xbfbfd9e8 // 加1 後的值
hoge_p..0xbfbfd9f4 // 加1 之後再加3 的值
指標運算的特徵:
對指標進行加1運算,地址的值會增加當前指標所指向資料型別的長度
該例程中hoge_p是指向int的指標,而在作者的環境中int型別的長度為4,所以給地址加1,指標前進4個位元組
要點:
對指標加 N,指標前進“當前指標指向的資料型別的長度×N”