讓你不再害怕指標!附乙個有趣的例子

2021-10-02 05:40:38 字數 3176 閱讀 3932

如下例1:

int *ptr;

char *ptr;

int **ptr;

int (*ptr)[3];

int *(*ptr)[4];

1、指標的型別從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別。 這是指標本身所具有的型別。 讓我們看看如下各個指標的型別:

int *ptr;	//指標的型別是 int*

char *ptr; //指標的型別是 char*

int **ptr; //指標的型別是 int**

int (*ptr)[3]; //指標的型別是 int(*)[3]

int *(*ptr)[4]; //指標的型別是 int*(*)[4]

2、指標所指向的型別當你通過指標來訪問指標所指向的記憶體區時, 指標所指向的型別決定了編譯器將把那片記憶體區里的內容當做什麼來看待。

從語法上看,你只須把指標宣告語句中的指標名字和名字左邊的指標宣告符*去掉,剩下的就是指標所指向的型別。 例如:

int *ptr;	//指標所指向的型別是 int

char *ptr; //指標所指向的的型別是 char

int **ptr; //指標所指向的的型別是 int*

int (*ptr)[3]; //指標所指向的的型別是 int()[3]

int *(*ptr)[4]; //指標所指向的的型別是 int*()[4]

在指標的算術運算中, 指標所指向的型別有很大的作用。

指標的型別(即指標本身的型別)和指標所指向的型別是兩個概念。

3、指標的值或者叫指標所指向的記憶體區或位址

指標的值是指標本身儲存的數值,這個值將被編譯器當作乙個位址。在 32 位程式裡, 所有型別的指標的值都是乙個32位整數, 因為32位程式裡記憶體位址全都是32位長。指標所指向的記憶體區就是從指標的值所代表的那個記憶體位址開始, 長度為sizeof(指標所指向的型別)的一片記憶體區。以後,我們說乙個指標的值是 xx,就相當於說該指標指向了以 xx 為首位址的一片記憶體區域;我們說乙個指標指向了某塊記憶體區域,就相當於說該指標的值是這塊記憶體區域的首位址。

指標所指向的記憶體區和指標所指向的型別是兩個完全不同的概念。 在例一中, 指標所指向的型別已經有了, 但由於指標還未初始化, 所以它所指向的記憶體區是不存在的, 或者說是無意義的。

4、指標本身所佔據的記憶體區

指標本身佔了多大的記憶體?你只要用函式 sizeof(指標的型別)測一下就知道了。 在 32 位平台裡, 指標本身佔據了4個位元組的長度。

乙個指標 ptrold 加(減)乙個整數 n 後, 結果是乙個新的指標 ptrnew,ptrnew 的型別和 ptrold 的型別相同, ptrnew 所指向的型別和 ptrold所指向的型別也相同。 ptrnew 的值將比 ptrold 的值增加(減少)了 n 乘sizeof(ptrold 所指向的型別)個位元組。 就是說, ptrnew 所指向的記憶體區將比 ptrold 所指向的記憶體區向高(低)位址方向移動了 n 乘sizeof(ptrold 所指向的型別)個位元組。

利用指標進行數值交換,然後子函式swap1 、swap2 、swap3中形式引數均為指標。

#include using namespace std;

void swap3(int* a, int* b)

void swap2(int* a,int* b)

void swap1(int *a, int *b)

int main()

執行如下:

//子函式 

extern int reppaths(const char *path, char *rpath, int nmax, gtime_t ts,

gtime_t te, const char *rov, const char *base)

//子函式 postpos

extern int postpos(gtime_t ts, gtime_t te, double ti, double tu,

const prcopt_t *popt, const solopt_t *sopt,

const filopt_t *fopt, char **infile, int n, char *outfile,

const char *rov, const char *base)

int main() ,

,,};

char* ofile = ;

//呼叫子函式

postpos(ts, te, ti, tu, &opt, &sopt, &fopt, infile, n, ofile, "", "");

}

main中,存在兩個字元指標陣列;其呼叫方式為:

對於陣列 int *arr2[20]=;為例:

//情況一

void test2(int *arr[20])

傳參方式直觀,實參與形參引數型別、大小均相同,便於理解。

//情況二

void test2(int **arr)

在這段**中,可以把int*看作乙個整體,將它typedef成為乙個型別t

那麼實參中的陣列定義就可以看成t arr2[20];了,呼叫函式傳參就可以看成t *arr,就與上面所講的一維整型陣列傳參如出一轍了。這樣傳參也是正確的。

所以指標陣列可以當做二級指標來傳參。

在postpos中:

在reppaths中:

結論:無論怎麼傳遞,資料型別不會變!

c語言形參和實參的區別(非常詳細)

if(指標變數)

當把乙個指標作為條件表示式時,所要判斷的條件實際上就是「該指標是否為一空指標」。在if,while,for或do/while等語句中,或者在條件表示式中,都可以使用指標。

示例**:

if (指標) else
c/c++中的 if(指標變數) 和 if(!指標變數)

2 讓你不再害怕指標 指標的算術運算

指標可以加上或減去乙個整數。指標的這種運算的意義和通常的數值的加減運算的意義是不一樣的,以單元為單位。例如 例二 char a 20 int ptr int a 強制型別轉換並不會改變a 的型別 ptr 在上例中,指標ptr 的型別是int 它指向的型別是int,它被初始化為指向整型變數a。接下來的...

5 讓你不再害怕指標 陣列和指標的關係

陣列的陣列名其實可以看作乙個指標。看下例 例九 int array 10 value value array 0 也可寫成 value array value array 3 也可寫成 value array 3 value array 4 也可寫成 value array 4 上例中,一般而言陣列...

7 讓你不再害怕指標 指標和函式的關係

可以把乙個指標宣告成為乙個指向函式的指標.int fun1 char int int pfun1 char int pfun1 fun1 int a pfun1 abcdefg 7 通過函式指標呼叫函式。可以把指標作為函式的形參。在函式呼叫語句中,可以用指標表示式來作為實參。例十四 int fun ...