1. 程式人生 > >C語言第八章:指標

C語言第八章:指標

第一節指標
什麼是指標:指標就是地址
int *pi; //一個指向整形變數的指標
一、 理解地址
1、 每個記憶體單元都有地址,地址是不會變的,但是地址的內容是不確定的。
2、 地址就是指標,也就是記憶體單元的編號。
3、 記憶體單元的地址和記憶體單元的內容是不同的概念。
4、 “無指標,不自由”出自書《指標的藝術》
二、 使用指標的好處
1、 讓函式有多個返回值
2、 使函式有修改變數的靈活手段
3、 可以改善某些子程式的效率
4、 為動態資料結構(二叉樹、連結串列)提供支援
三、 變數的存取方式
分類:直接存取(變數的賦值和取值)和間接存取(通過地址去獲取儲存單元的值)
四、 指標變數的概念
1、 指標變數存的是一個記憶體單元的地址,嚴格意義上說指標就是一個地址,是一個常量。
2、 如何去定義一個指標變數 包括:型別說明符 ,指標變數名 ,變數值 ;一般格式:型別說明符 *變數名
3、 int *p //定義了一個整形變數 ,變數名是p,int表示,p只能存放一個int型別的變數地址
4、 注意事項:
1) 、* 表示定義的是一個指標變數,如果沒有的話就相當於一個普通變數
2) 、指標變數不可以存放數值
3) 、指標變數範圍有全域性變數和區域性變數
五、 指標變數的初始化
1、 一個*是指一級指標,指標變數的初始化有兩種定義的同時初始化和先定義後初始化
1)、定義的同時 初始化: int a=5; int *p=&a; //p指向a,
2)、先定義後初始化 :int b=5; int *p; p=&b ;
3)、定義一個指標變數,但是不知道這個指標指向誰,定義:int *p2=NULL;//NULL是空(0)//含義:就是什麼也不指。

  2、指標變數的使用:定義指標變數 --→初始化指標變數-----→使用指標變數(間接的存取單元的值)

3、 指標變數如果不初始化會有什麼後果?
答:會產生垃圾值,也稱為野指標。一定要避免野指標,可能會出現嚴重的後果
int p; int x=6; 正確的賦值是:p=&x; 錯誤 *p=x; 因為沒有給p指向,它是一個野指標,會報錯的
指標變數也是有地址的
4、 常見的易犯的錯誤:int *p5=1000;(錯誤寫法)
5、 *指標變數 作用:獲取指標變數指向的記憶體空間的內容
總結:*的兩種用法
!)、用於定義一個指標變數
!!)、獲取地址空間對應的值,同樣也可以修改地址所對應的值
六、 使用指標實現兩個數的交換
注意:傳的是指標(也就是地址)
函式的實參和形參的型別要相同,比如地址就是指標 ,值就傳值。
七、 指標的應用場景
1、 在被調函式中可以修改主調函式中的變數的值
2、 函式返回多個值
八、 二級指標
1、 概念:一個指標變數存放的是另一個指標變數的地址,則稱這個指標變數是指向指標變數的指標。
九、指標為何要區分型別: 一個指標佔8個位元組。定義什麼型別的指標就指向什麼型別的變數。(為了防止資料引用錯誤)

結論:定義什麼型別的指標就應該指向什麼型別的變數。

應用:使用指標實現 函式中兩變數值交換

第二節 陣列指標

一、 陣列指標
1、 陣列指標的概念:一個指標變數指向一個數組元素。(指向陣列的指標)
注意:1)、陣列名不代表整個陣列,只代表陣列首元素的地址
2、 使用陣列的指標引用陣列的元素
3、 作用:使用陣列指標間接的訪問陣列的元素。如int a[4]={1,2,3,4}; int *p=a;===⇒int *p1=&a[0]
4、 陣列指標的用法: 記住:不是數值而是元素
1)、p+1 表示指向陣列的下一個陣列元素
2)、p-1 指向陣列的上一個元素
5、 使用陣列指標和使用陣列名的區別
1)、陣列指標可以進行自加和自減運算,而陣列名不可以,因為陣列名是常量。(學習誤區:a陣列名是一個常量,不能++)
2)、陣列指標比陣列名的功能多,可以直接操作地址。
6、 p是一個變數。既然是一個變數,它存放的數的值是可以改變的。
結論:引用陣列元素的兩種方法:指標法 ,陣列名(下標法)a[i]=p[i]=*(p+i)
總結:對於一個一維陣列來說,
1)、獲取a[i]的地址有幾種方法?取值就是在地址的基礎上
答:a、&a[i]
b、a+i
c、int *p=a;
p+i;

二、指標陣列
指標陣列:(存放指標的陣列)一個數組元素值(內容)為指標的陣列。指標陣列是一組有序的指標的集合。相當於存放地址的陣列 指標陣列的所有元素都必須具有相同儲存型別和指向相同資料型別的指標變數。 指標陣列就是一個二維陣列
格式:int *pa[3] //儲存的是3個整型的指標
解析:定義了一個指標陣列,陣列名是pa,可以用來存放3個指標(必須是整型變數的指標)。
三、 指標變數之間的運算
1、 兩個指標之間的減法運算
1)、常見的用法:兩個指標都指向同一個陣列
i、判斷兩個指標變數指向的元素是否連續
ii、判斷兩個指標變數之間相隔幾個元素
注意:兩個指標變數之間沒有加法(越界問題)
如果兩個指標指向同一個元素,那麼他們相減的結果是0
判斷兩個指標變數指向的元素是否相鄰,他們相減的結果是1得絕對值。
2、 兩個指標之間的關係運算
i、p1>p 1表示p1在高位 0表示p在高位或者在同一位置。
3、陣列名訪問二維陣列
int ch[3][4]={};
1、注意陣列名訪問陣列元素的幾種方式:ch,ch[0],&ch[0],&ch[0][0],*ch
2、陣列元素地址的幾種表示:**ch,*ch[0],ch[0][0]

四、 二維陣列指標
1、陣列名是指向行 的!! 也就是說陣列指標指向一維陣列的指標,行指標,用來指向二維陣列的每一行,存放的是行的首地址。
格式:資料型別
資料型別 (*變數名)[二維陣列列數]
3、 二維陣列指標的初始化
int (*p)[4]=a;
2、二維陣列指標的使用
(p+i)+j) ===⇒ *(p+i)
4、指標陣列和二維陣列指標的區別?
I、int *pa[3]={&a,&b,&c}//指標陣列
II、int (*pa1)[3]=a;//二維陣列指標

五、 字串指標介紹及使用
字串指標格式:char *變數名=“字串內容”//內容是常量。

1、定義:char *p=”you

”; 這個字串儲存在常量區,p值儲存了字串常量的首地址,指標都佔用8個位元組,p是一個指標變數,值是可以改變的。
2、字串指標的作用:用來儲存一個字串
注意:1、使用字串指標存的是字串的地址(常量區),只能通過地址的取值去實現遍歷,它是不可以被更改得,是隻讀的。
2、字元陣列存在棧區,可以更改
3、從鍵盤輸入不能用字串指標去儲存。Char *str;

但是:可以用str=malloc(100)去申請100個位元組的記憶體,這樣就可以輸入接收了;也可以先指向一個字元陣列,在利用變數去實現接收。

str=malloc(100);的標頭檔案是#include