目錄
一、指針和位址
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 = #
int **pp = &p;