指針(數據內存單元的編號叫做地址,也稱作指針)
內存單元的指針和內存單元的內容是兩個不同的概念。對於一個內存單元來說,單元的地址(編號)即爲指針,其中存放的數據纔是該單元的內容。
在C語言中,允許用一個變量來存放指針,這種變量稱爲指針變量。
嚴格地說,一個指針是一個地址,是一個常量。而一個指針變量卻可以被賦予不同的指針值,是變量。但常把指針變量簡稱爲指針。爲了避免混淆“指針”是指地址,是常量,“指針變量”是指取值爲地址的變量。定義指針的目的是爲了通過指針去訪問內存單元。
爲什麼要引入指針這個東西?
數組或函數都是連續存放的。通過訪問指針變量取得了數組或函數的首地址,也就找到了該數組或函數。這樣一來,凡是出現數組,函數的地方都可以用一個指針變量來表示,只要該指針變量中賦予數組或函數的首地址即可。這樣做,將會使程序的概念十分清楚,程序本身也精練、高效。
在C語言中,一種數據類型或數據結構往往都佔有一組連續的內存單元。用“地址”這個概念並不能很好地描述一種數據類型或數據結構,而“指針”雖然實際上也是一個地址,但它卻是一個數據結構的首地址,它是“指向”一個數據結構的,因而概念更爲清楚,表示更爲明確。
這也是引入“指針”概念的一個重要原因。
表示指針變量和它所指向的變量之間的關係,在程序中用*
符號表示“指向”
int i = 3;(定義一個整型i等於3) *p = &i;(指針p指向i的地址從而取到i在內存中表示的值)爲了方便理解,p就代表某個數據的地址,*p就是這個地址上的數據。
定義指針變量
定義指針變量的一般形式爲:*
表示這是一個指針變量,變量名
是一個合法的標識符,類型說明符
表示該指針變量所指向的變量的數據類型。例如:
int *p1;表示p1是一個指針變量,它的值是某個整型變量的地址。或者說p1指向一個整型變量。至於p1究竟指向哪一個整型變量,應由向p1賦予的地址來決定。再如:
- int *p2; //p2是指向整型變量的指針變量
- float *p3; //p3是指向浮點變量的指針變量
- char *p4; //p4是指向字符變量的指針變量
指針變量的引用
指針變量同普通變量一樣,使用之前不僅要定義說明,而且必須賦予具體的值(初始化)。未初始化的指針變量的值是垃圾值,沒有意義,不能使用,例如:- #include <stdio.h>
- int main(){
- int *p;
- printf("%X\n", p); //十六進制輸出p
- return 0; //因爲定義函數爲int型,必須要有返回值(切記)
- }
- &:取地址運算符;
- *:指針運算符(或稱“間接訪問” 運算符)。
&
來獲取變量的地址。其一般形式爲:
&a
表示變量a的地址,&b
表示變量b的地址。變量本身必須預先定義。設有指向整型變量的指針變量p,如要把整型變量 a 的地址賦予p可以有以下兩種方式。
1) 指針變量初始化的方法:
int a=10; int *p=&a;2) 賦值語句的方法:
int a=10; int *p; p=&a;指針是變量,我們可以通過改變它們的指向,以間接訪問不同的變量,這給程序員帶來靈活性,也使程序代碼編寫得更爲簡潔和有效。
輸入a和b兩個整數,按先大後小的順序輸出。
#include <stdio.h> void main(){ int *max, *min,*tmp, a, b; scanf("%d, %d",&a, &b); max = &a; min = &b; if(*max < *min){ // 交換指針變量的值,tmp 爲臨時變量 tmp = max; max = min; min = tmp; } printf("a=%d, b=%d\n", a, b); printf("max=%d, min=%d\n", *max, *min);
getchar(); }