1. 程式人生 > >《征服C指標》——讀書筆記(1)

《征服C指標》——讀書筆記(1)

一、指標的基本知識

示例程式碼:

#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”