C语言中的指针详解
1. 什么是指針
C語言中指針是一種數據類型,指針是存放數據的內存單元地址。
計算機系統的內存擁有大量的存儲單元,每個存儲單元的大小為1字節,為了便于管理,必須為每個存儲單元編號,該編號就是存儲單元的“地址”,每個存儲單元擁有一個唯一的地址。
指針變量除了可以存放變量的地址外,還可以存放其他數據的地址,例如可以存放數組和函數的地址。
2. 指針的定義和初始化
格式:數據類型符 *指針變量名[=初始地址值]。
功能:定義指向“數據類型符”的變量或數組的指針變量,同時為其賦初值。
定義說明:
1.?“*” 表示定義的是一個指針變量,指針變量的前面必須有 “*” 號;
2.?在定義指針變量的同時也可以定義普通變量或數組等其它變量;
3.?“數據類型符” 是指針變量所指向變量的數據類型,可以是任何基本數據類型,也可以是其他數據類型;
4.?“初始地址值” 通常是 “&變量名” “&數組元素” 或 “一維數組名”,這里的變量或數組必須是已定義的;
5.?在定義指針變量時,可以只給部分指針變量賦初值;
6.?指針變量的初始化,除了可以是已定義變量的地址,也可以是已初始化的同類型的指針變量,也可以是NULL(空指針);
7.?指針變量初始化時,指針變量的“數據類型符”必須與其“初始地址值”中保存的數據的類型相同;
8. 不能用auto類型的地址去初始化static型指針。
3.?指針變量的使用
1. 給指針變量賦值
格式:指針變量=地址型表達式
“地址型表達式”即運算結果是地址型的表達式。C語言規定,變量地址只能通過取地址運算符獲得,即“&”,其運算對象是變量或數組元素名,運算結果是對應變量或數組元素的地址。
需要注意的是,雖然地址是一個整數,但是C語言中不允許把整數看成“地址常量”,所以此處的“地址型表達式”不能是整數。
2.?使用指針變量
格式:指針變量名
需要使用地址時,可以直接引用指針變量名。
3.?通過指針變量引用所指向的變量
格式:*指針變量名
“*指針變量名” 代表其指向的變量或數組元素,其中的“*”稱為指針運算符。需要注意的是,這種引用方式要求指針變量必須已經定義且有值。
4. 指針的基本運算
1.?取地址運算符 &
取地址運算符“&”的功能是取變量的地址,它是單目運算符。取地址運算符的運算對象必須是已經定義的變量或數組元素,但不能是數組名。運算結果是運算對象的地址。
2.?指針運算符?*
指針運算符“*”的功能是取指針變量所指向地址中的內容,與取地址運算符“&”的運算是互逆的,它是單目運算符。指針運算符的運算對象必須是地址,可以是已賦值的指針變量,也可以是變量或數組元素的地址,但不能是整數,也不能是非地址型的變量。運算結果就是地址對應的變量。
?取地址運算符和指針運算符的優先級和結合性:
1.?取地址運算符、指針運算符和自增、自減等單目運算符的優先級相同;
2.?所有單目運算符的結合性為從右至左。
5. 指針的算術運算
指針變量可以進行的算術運算包括:
1.?指針變量 ± 整數;
2.?指針變量++ 與 ++指針變量;
3.?指針變量-- 與 --指針變量;
4.?指針變量1- 指針變量2;
由于指針運算符*與自增運算符++、自減運算符--的優先級相同,結合方向都是從右至左,因此需要注意以下各種形式的含義不同。
6.?指針的關系運算
兩個類型相同的指針變量可以運用關系運算符比較大小,表示兩個指針變量所指向地址位置的前后關系,即:前者為小,后者為大。
需要注意的是,如果兩個指針變量不是指向同一個數組,則比較大小沒有實際意義。
7. 指針變量的引用
1.?通過指針變量訪問整型變量
2.?指針變量作為函數參數
普通變量作為函數的參數傳遞時是按值傳遞,實參與形參不共享內存。指針變量作為函數參數時是地址傳遞,共享內存,“雙向傳遞”。
以下是按值傳遞的情況:
?以下是按地址傳遞的情況:
8.?指針和數組
數組的指針是指向數組在內存的起始地址,數組元素的指針是指向數組元素在內存的起始地址。
1.?當指針變量指向一維數組,可以采用以下兩種方法:
(1).?在數據定義語句中用賦初值的方式:*指針變量=數組名;
(2).?在程序中用賦值的方式:指針變量=數組名;
2. 當指針變量指向一維數組元素,可以采用以下兩種方法:
(1).?在數據定義語句中用賦初值的方式: *指針變量=&數組名[下標];
(2).?在程序中用賦值的方式: 指針變量=&數組名[下標];
3.?當指針變量指向一維數組,利用指針變量引用一維數組元素的方法如下:
(1).?引用下標為0的數組元素:*(指針變量+0) 或 *指針變量 或 指針變量[0];
(2).?引用下標為 i 的數組元素:*(指針變量+i) 等同于?指針變量[i] 或者 指針變量[i] 等同于?數組名[i];
4.?當指針變量指向一維數組元素,利用指針變量引用數組元素的方法如下:
(1).?引用下標為 i 的數組元素:*(指針變量 + 0) 或 *指針變量;
(2).?引用下標為 i-k 的數組元素:*(指針變量 - k);
(3).?引用下標為 i+k 的數組元素:*(指針變量 + k);
上面的總結文字看起來有枯燥,下面兩張圖看起來會更生動和形象一些。
?還有下面這張:
9. 指針和字符串
將指針變量指向字符串的方法如下:
1.?在數據定義語句中用賦初值的方式:*指針變量=字符串;
2.?在程序中用賦值的方式:指針變量=字符串;
需要注意的是,這兩種方法并不是將字符串賦予指針變量,而是將存放字符串的連續內存單元的首地址賦予指針變量。
當指針變量指向字符串時,則可以利用指針變量處理字符串,處理方式有以下幾種:
1. 處理整個字符串
(1). 輸出整個字符串:printf("%s",指針變量);
(2). 輸入整個字符串:scanf("%s",指針變量);
#include "stdio.h" int main(){char *string = "I love China";printf("%s",string);// I love Chinareturn 0; }2.?處理字符串中的單個字符
(1). 輸出整個字符串:printf("%c",指針變量);
(2). 輸入整個字符串:scanf("%c",指針變量);
#include "stdio.h" int main(){char *string = "I love China";for(;*string!='\0';string++){printf("%c",*string);// I love China};return 0; }C語言中,字符串是按字符數組進行處理的,系統存儲一個字符串時先分配一個起始地址,從該地址開始連續存放字符串中的字符,這一起始地址即字符串首字符的地址。所以,可以將一個字符串賦值給一個字符數組,也可以賦值給一個字符指針變量。
常見的字符串的表現形式如下:
1. 用字符數組表示字符串
2. 用字符指針表示字符串
3. 用下標存取字符串中的字符
字符指針和字符數組的區別:
1. 存儲內容不同;
2. 賦值方式不同;
3. 字符指針變量在定義后應先賦值才能引用;
4. 指針變量的值是可以改變的,字符指針變量也不例外;而數組名代表數組的首地址,是一個常量,而常量是不能改變的。
10. 指針和函數
指針變量既可以作為函數的形參,也可以作為函數的實參。指針變量作為函數參數,形參和實參之間的數據傳遞方式本質上是值傳遞,只是在調用函數時傳遞的內容是地址,這樣使得形參變量和實參變量指向同一個變量。若被調函數中有對形參所指變量內存的改變,實際上是改變了實參所指變量的內容。
數組名作為函數形參時,接收實參數組的首地址;數組名作為函數實參時,將數組的首地址傳遞給形參數組。
引入指向數組的指針變量后,數組及指向數組的指針變量作為函數參數時,可有四種等價形式:
1.?形參、實參均為數組名;
?2.?形參、實參均為指針變量;
3.?形參為指針變量、實參為數組名;
?4.?形參為數組名、實參為指針變量
C語言中,函數可以返回整型、實型、字符型數據,也可以返回指針類型數據,即返回一個地址。指針型函數是指函數的返回值是指針型,即這類函數的返回值必須是地址值,調用該類函數時,接收返回值的必須是指針變量、指針數組元素等能夠存放地址值的對象。
定義指針型函數的格式和有返回值的函數的定義格式基本相同,唯一的區別是在函數名前面加一個“*”,表示函數的返回值是指針型數據。
指針型函數的調用和一般函數的調用方法完全相同,但需要注意的是只能使用指針變量或指針數組元素接收指針型函數的返回值,不能使用數組名接收指針型函數的返回值,因為函數名是地址常量,不是地址型變量,不能接收地址型變量數據。
11. 指針數組
指針數組是數組中的元素均為指針變量。
格式:數據類型符 *指針數組名[數組長度]。
功能:定義指針數組,有“長度”個數組元素。
定義說明:
1.?指針數組名是標識符,前面必須加“*”號;
2.?定義指針數組的同時可以定義普通變量、數組和指針變量等;
3.?“數據類型符” 可以是任何基本數據類型,“數據類型符”不是指針數組元素中存放的數據類型,而是其所指向數據的數據類型。
指針數組的初始化
1. char *ps[]={"China","America","Russia",NULL};
定義了一個用于指向字符型數據的指針數組ps,其長度為4,同時對指針數組元素賦初值,前面三個是字符型指針,最后一個是空指針。
2.?int a[3][3]={1,2,3,4,5,6,7,8,9}; int *p[3]={a[0],a[1],a[2]};
利用二維數組元素初始化指針數組p,其長度為3,分別指向二維數組a中的三個一維數組的首地址。
指針數組元素的賦值
1. 將數組名賦予指針數組各元素
char s[4][20]={“China”,”America”,”Russia”,NULL}; char *p[4]; p[0]=s[0];
給指針數組元素p[0]賦值s[0],s[0]是字符串“China”的首地址。
2. 將字符串直接賦予指針數組元素
char *p[4]; p[0]=“China”;
直接給指針數組元素p[0]賦值為字符串“China”的首地址。
指針元素的使用
指針數元素的使用和指針變量的使用完全相同,可以對其賦予地址值,可以利用其引用所指向的變量或數組元素,也可以參與運算。
?指針元素應用實例
1. 指針在整形二維數組中的使用
?2. 定義三個國家的名稱,將國家名稱按字母順序排序后輸出。
總結
- 上一篇: 【2016.11.17】HTML学习笔记
- 下一篇: dtrace