指針的概念以及一些小祕密

指針(數據內存單元的編號叫做地址,也稱作指針)

內存單元的指針和內存單元的內容是兩個不同的概念。對於一個內存單元來說,單元的地址(編號)即爲指針,其中存放的數據纔是該單元的內容。

在C語言中,允許用一個變量來存放指針,這種變量稱爲指針變量

嚴格地說,一個指針是一個地址,是一個常量。而一個指針變量卻可以被賦予不同的指針值,是變量。但常把指針變量簡稱爲指針。爲了避免混淆“指針”是指地址,是常量,“指針變量”是指取值爲地址的變量。定義指針的目的是爲了通過指針去訪問內存單元。

爲什麼要引入指針這個東西?

數組或函數都是連續存放的。通過訪問指針變量取得了數組或函數的首地址,也就找到了該數組或函數。這樣一來,凡是出現數組,函數的地方都可以用一個指針變量來表示,只要該指針變量中賦予數組或函數的首地址即可。這樣做,將會使程序的概念十分清楚,程序本身也精練、高效。

在C語言中,一種數據類型或數據結構往往都佔有一組連續的內存單元。用“地址”這個概念並不能很好地描述一種數據類型或數據結構,而“指針”雖然實際上也是一個地址,但它卻是一個數據結構的首地址,它是“指向”一個數據結構的,因而概念更爲清楚,表示更爲明確。 這也是引入“指針”概念的一個重要原因。

表示指針變量和它所指向的變量之間的關係,在程序中用*符號表示“指向”

int i = 3;(定義一個整型i等於3)
*p = &i;(指針p指向i的地址從而取到i在內存中表示的值)
爲了方便理解,p就代表某個數據的地址,*p就是這個地址上的數據。

定義指針變量

定義指針變量的一般形式爲:
類型說明符 *變量名;
其中,*表示這是一個指針變量,變量名是一個合法的標識符,類型說明符表示該指針變量所指向的變量的數據類型。例如:
int *p1;
表示p1是一個指針變量,它的值是某個整型變量的地址。或者說p1指向一個整型變量。至於p1究竟指向哪一個整型變量,應由向p1賦予的地址來決定。再如:
  1. int *p2; //p2是指向整型變量的指針變量
  2. float *p3; //p3是指向浮點變量的指針變量
  3. char *p4; //p4是指向字符變量的指針變量
應該注意的是,一個指針變量只能指向同類型的變量,如 p3 只能指向浮點變量,不能時而指向一個浮點變量,時而又指向一個字符變量。

指針變量的引用

指針變量同普通變量一樣,使用之前不僅要定義說明,而且必須賦予具體的值(初始化)。未初始化的指針變量的值是垃圾值,沒有意義,不能使用,例如:

  1. #include <stdio.h>
  2. int main(){
  3. int *p;
  4. printf("%X\n", p); //十六進制輸出p
  5. return 0; //因爲定義函數爲int型,必須要有返回值(切記)
  6. }
兩個有關的運算符
  • &:取地址運算符;
  • *:指針運算符(或稱“間接訪問” 運算符)。


C語言中提供了地址運算符&來獲取變量的地址。其一般形式爲:
&變量名;
&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();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章