嵌入式C語言完全學習筆記(七)

8、指針
    指針全稱是指針變量,其實質是C語言的一種變量。這種變量比較特殊,通常它的值會被
    賦值爲某個變量的地址值(p = &a),然後我們可以使用*p這樣的方式去間接訪問p所
    指向的那個變量。
8.1、爲什麼需要指針?
    指針存在的目的就是間接訪問。有了指針之後,我們訪問變量a不必只通過a這個變量名來
    訪問。而可以通過p = &a; *p = xxx;這樣的方式來間接訪問變量a。
    
8.2、兩種重要運算符:&和*
&:取地址符,將它加在某個變量前面,則組合後的符號代表這個變量的地址值。
例如: int a; int *p; p = &a; 則將變量a的地址值賦值給p。
就在上面的例子中,有以下一些符號:
    a        代表變量a本身
    p        代表指針變量p本身
    &a        代表變量a的地址值
    *p        代表指針變量p所指向的那個變量,也就是變量a
    &p        代表指針變量p本身的地址值。符號合法,但對題目無意義
    *a        把a看作一個指針,*a表示這個指針所指向的變量。該符號不合法

*:指針符號。指針符號在指針定義和指針操作的時候,解析方法是不同的。
int *p;        定義指針變量p,這裏的*p含義不是代表指針變量p所指向的那個變量,在定義時
這裏的*含義是告訴編譯器p是一個指針。
int p;        // p是一個整形變量
int *p;        // p是一個指針變量,該指針指向一個整形數
使用指針的時候,*p則代表指針變量p所指向的那個變量。


8.3、指針的定義和初始化
指針既然是一種變量,那麼肯定也可以定義,也可以初始化
第一種:先定義再賦值
    int *p;        // 定義指針變量p
    p = &a;        // 給p賦值                
第二種:定義的同時初始化
    int *p = &a;    // 效果等同於上面的兩句

8.4、各種不同類型的指針
指針變量本質上是一個變量,指針變量的類型屬於指針類型。int *p;定義了一個指針類型的
變量p,這個p所指向的那個變量是int型。

int *pInt;                // pInt是指針變量,指向的變量是int類型
char *pChar;            // pChar是指針類型,指向的變量是char類型
float *pFloat;
double *pDouble;
各種指針類型和它們所指向的變量類型必須匹配,否則結果不可預知。


8.5、指針定義的兩種理解方法:
int *p;    
第一種:首先看到p,這個是變量名;其次,p前面有個*,說明這個變量p是一個指針變量;最後,*p前面有一個int,說明這個指針變量p所指向的是一個int型數據。

char *(*(*pfunc)[])(char *, char *) 類似的複雜表達式,可以用相同的分析方法得到

第二種:首先看到p,這個是變量名;其次,看到p前面的int *,把int *作爲一個整體來理解,
int *是一種類型(複合類型),該類型表示一種指向int型數據的指針。

總結:第二種方法便於理解,但是不夠本質;建議用第一種方法來理解,因爲這種思維過程可以幫我們理解更復雜的表達式。

8.6、指針與數組的初步結合

數組名:做右值時,數組名錶示數組的首元素首地址,因此可以直接賦值給指針。
如果有 int a[5];
則 a和&a[0]都表示數組首元素a[0]的首地址。
而&a則表示數組的首地址。

注意:數組首元素的首地址和數組的首地址是不同的。前者是數組元素的地址,而後者是數組整體的地址。兩個東西的含義不同,但是數值上是相同的。

根據以上,我們知道可以用一個指針指向數組的第一個元素,這樣就可以用間接訪問的方式去逐個訪問數組中各個元素。這樣訪問數組就有了兩種方式。
有 int a[5];  int *p; p = a;
數組的方式依次訪問:a[0]    a[1]    a[2]    a[3]    a[4]
指針的方式依次訪問:*p        *(p+1)  *(p+2)    *(p+3)    *(p+4)

8.7、指針與++ --符號進行運算
指針本身也是一種變量,因此也可以進行運算。但是因爲指針變量本身存的是某個其他變量的地址值,因此該值進行* / %等運算是無意義的。兩個指針變量相加本身也無意義,相減有意義。指針變量+1,-1是有意義的。+1就代表指針所指向的格子向後挪一格,-1代表指針所指向的格子向前挪一格。

*p++就相當於*(p++),p先與++結合,然後p++整體再與*結合。
*p++解析:++先跟p結合,但是因爲++後置的時候,本身含義就是先運算後增加1(運算指的是p++整體與前面的*進行運算;增加1指的是p+1),所以實際上*p++符號整體對外表現的值是*p的值,運算完成後p再加1.
所以*p++等同於:*p;   p += 1;

*++p等同於 p += 1;    *p;

(*p)++,使用()強制將*與p結合,只能先計算*p,然後對*p整體的值++。

++(*p),先*p取值,再前置++,該值+1後作爲整個表達式的值。

總結:++符號和指針結合,總共有以上4種情況。--與++的情況很類似。

8.8、函數傳參中使用指針
int add(int a, int b)    函數傳參使用了int型數,本身是數值類型。實際調用該函數時,
實參將自己拷貝一份,並將拷貝傳遞給形參進行運算。實參自己實際是不參與的。
所以,在函數中,是沒法改變實參本身的。


2、
C語言基礎大模塊:
數據類型
運算符
三種程序結構
函數
數組
指針
結構體、公用體、枚舉


基礎知識 + 推斷能力
學習 = 基礎知識 + 合理推論

 

 

 

8、指針
    指針全稱是指針變量,其實質是C語言的一種變量。這種變量比較特殊,通常它的值會被
    賦值爲某個變量的地址值(p = &a),然後我們可以使用*p這樣的方式去間接訪問p所
    指向的那個變量。
8.1、爲什麼需要指針?
    指針存在的目的就是間接訪問。有了指針之後,我們訪問變量a不必只通過a這個變量名來
    訪問。而可以通過p = &a; *p = xxx;這樣的方式來間接訪問變量a。
    
8.2、兩種重要運算符:&和*
&:取地址符,將它加在某個變量前面,則組合後的符號代表這個變量的地址值。
例如: int a; int *p; p = &a; 則將變量a的地址值賦值給p。
就在上面的例子中,有以下一些符號:
    a        代表變量a本身
    p        代表指針變量p本身
    &a        代表變量a的地址值
    *p        代表指針變量p所指向的那個變量,也就是變量a
    &p        代表指針變量p本身的地址值。符號合法,但對題目無意義
    *a        把a看作一個指針,*a表示這個指針所指向的變量。該符號不合法

*:指針符號。指針符號在指針定義和指針操作的時候,解析方法是不同的。
int *p;        定義指針變量p,這裏的*p含義不是代表指針變量p所指向的那個變量,在定義時
這裏的*含義是告訴編譯器p是一個指針。
int p;        // p是一個整形變量
int *p;        // p是一個指針變量,該指針指向一個整形數
使用指針的時候,*p則代表指針變量p所指向的那個變量。


8.3、指針的定義和初始化
指針既然是一種變量,那麼肯定也可以定義,也可以初始化
第一種:先定義再賦值
    int *p;        // 定義指針變量p
    p = &a;        // 給p賦值                
第二種:定義的同時初始化
    int *p = &a;    // 效果等同於上面的兩句

8.4、各種不同類型的指針
指針變量本質上是一個變量,指針變量的類型屬於指針類型。int *p;定義了一個指針類型的
變量p,這個p所指向的那個變量是int型。

int *pInt;                // pInt是指針變量,指向的變量是int類型
char *pChar;            // pChar是指針類型,指向的變量是char類型
float *pFloat;
double *pDouble;
各種指針類型和它們所指向的變量類型必須匹配,否則結果不可預知。


8.5、指針定義的兩種理解方法:
int *p;    
第一種:首先看到p,這個是變量名;其次,p前面有個*,說明這個變量p是一個指針變量;最後,*p前面有一個int,說明這個指針變量p所指向的是一個int型數據。

char *(*(*pfunc)[])(char *, char *) 類似的複雜表達式,可以用相同的分析方法得到

第二種:首先看到p,這個是變量名;其次,看到p前面的int *,把int *作爲一個整體來理解,
int *是一種類型(複合類型),該類型表示一種指向int型數據的指針。

總結:第二種方法便於理解,但是不夠本質;建議用第一種方法來理解,因爲這種思維過程可以幫我們理解更復雜的表達式。


2、
C語言基礎大模塊:
數據類型
運算符
三種程序結構
函數
數組
指針
結構體、公用體、枚舉


基礎知識 + 推斷能力
學習 = 基礎知識 + 合理推論


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章