天天看點

從零開始一起學C語言(五)---指針一、指針和位址二、指針的使用三、指針的大小四、指針和數組五、指針和函數六、函數的參數傳遞七、指針和字元串八、多級指針

目錄

一、指針和位址

1、位址

2、指針

二、指針的使用

1、定義

2、初始化

3、指針的引用

4、空指針

5、野指針

三、指針的大小

四、指針和數組

五、指針和函數

1、指針函數

2、函數指針

六、函數的參數傳遞

1、值傳遞:傳遞的參數為普通變量,改變形參的值,實參的值不會改變。

2、址傳遞:傳遞的參數為一個位址,子函數可以通過該位址通路到實參。

七、指針和字元串

八、多級指針

一、指針和位址

1、位址

現實生活中的位址:鄭州市、二七區、民主路6号。人為規定的位址。

c語言中的位址:給一塊實體記憶體或則虛拟記憶體進行位址的編号,以位元組為機關,按順序進行編号。

2、指針

一個存放位址的變量。通常稱為指針變量。

二、指針的使用

1、定義

類型說明符 *指針名;

*說明這是一個指針變量。

類型說明符:指針指向記憶體單元存儲的資料類型。

例:int *p;//定義一個指針變量,該指針能指向一個存儲整形資料的記憶體單元。

char *p;//定義一個指針變量,可以指向一個存儲字元類型資料的存儲單元。

2、初始化

int num;

int *p = #//用一個位址來初始化指針。

3、指針的引用

int num = 10;     

int *p;

p = #// & 取位址運算符

*p = 5;   //num = 5;  // * 指針運算符,用來通路指針指向的記憶體單元。

4、空指針

       沒有指向任何對象或則函數的指針(不能了解為未初始化的指針),通常了解為指向0記憶體單元。c語言中規定用宏定義NULL來表示空指針。

例:int *p = NULL;//int *p = 0;

5、野指針

       指向未知記憶體單元的指針。例:未初始化的指針,看似沒有指向,其實指向一個未知的記憶體單元,有可能存儲的是系統代碼,對其内容修改有可能使系統崩潰。是以要避免出現野指針。

三、指針的大小

32位的cpu有32位位址總線,對應指針的大小為4個位元組。

注意:大小和指向的内容無關。

四、指針和數組

數組:内部的元素在記憶體中是連續排列的,數組名表示數組的首位址。

使指針指向數組的兩種方式:

int num[5]={1,2,3,4,5};

int *p = num;//數組名表示數組的首位址

int *p = &num[0];//數組第一個元素的位址

指針指向數組的時候,指針++對應的是元素類型大小的變化。

指針數組:就是一個數組,裡面的元素全部是指針。

一般批量處理字元串時使用。

char *p[3]={“fjaljf”,”gafaf”,”agggs”};

五、指針和函數

1、指針函數

就是一個函數,傳回值為指針。

注意:傳回的指針要有意義,即指針指向的内容不能被釋放。

一般傳回的是靜态變量指針或則字元串指針。

#include <stdio.h>

char *fun();

int main()

{

         char *p;

         p = fun();

         printf("%s\n",p);

         return 0;

}

char *fun()

{

         char str[] = "jfjlaj";

         static char str1[] = "jglaj";

         char *p = "jfjlaj";

         //return str; //錯誤

         //return str1;//正确

         return p;   //正确

}
           

2、函數指針

就是一個指針,指向一個函數。可以通過指針來通路該函數。

定義: 類型說明符 (*指針名)(參數類型);

例:int fun(int a); 函數指針為:int (*p)(int);//

#include <stdio.h>

int fun(int a);

int main()

{

       int (*p)(int);

       p = fun;

       p(30);//fun(30);

       return 0;

}

int fun(int a)

{

       printf("%d\n",a);

       return 0;

}
           

g)一個指向函數的指針,該函數有一個整型參數并傳回一個整型數 

Int (*a)(int)

h)一個有 10 個指針的數組,該數組的每一個元素都是指針,并指向一個函數,該函數有一個整型參數并傳回一個整型數Int (*a[10])(int)

六、函數的參數傳遞

c語言中參數的傳遞分為值傳遞和址傳遞。

1、值傳遞:傳遞的參數為普通變量,改變形參的值,實參的值不會改變。

#include <stdio.h>

int fun(int a);

int main()

{

         int b = 12;

         fun(b);

         printf("%d\n",b);  //b = 12;

         return 0;

}

int fun(int a)

{

         a = 10;

         return 0;

}
           

2、址傳遞:傳遞的參數為一個位址,子函數可以通過該位址通路到實參。

#include <stdio.h>

int fun(int *p);

int main()

{

         int b = 12;

         fun(&b);

         printf("%d\n",b);// b =10;

         return 0;

}

int fun(int *p)

{

         *p = 10;

         return 0;

}
           

七、指針和字元串

c語言中允許用一個字元串來初始化一個指針。該指針指向字元串的首位址。

例:char *p = “jljhjljga”;

       char str[] = “gjlag”;

        p = str ;

注意:不能通過該指針改變字元串的值,因為字元串為常量,隻讀不可改變。但是指針的指向是可以改變的。

八、多級指針

指針的指針

定義: 類型說明符 **指針名;

int num = 5;

int *p = &num;

int **pp = &p;