天天看點

C 指針

C 指針(完善中。。。)

一、認識存儲單元

指針是C語言最顯著的特色。要了解指針的概念,需要先了解計算機讀寫記憶體的的方式以及變量的概念。

計算機記憶體是以位元組為機關劃分記憶體單元的,每個記憶體單元占用一個位元組,每個記憶體單元都有自己的位址編号,作業系統或軟體根據這個位址來識别記憶體單元,在位址所辨別的記憶體單元中存取資料。記憶體單元的位址是固定的,記憶體單元中的資料是可以修改的。

C語言中,變量名實質上是記憶體單元的位址符号,使用者使用變量本質上是通路該變量所對應的記憶體單元。

二、C指針的概念

1、在C中,将記憶體單元的位址(編号)稱為指針,可以通過一個變量來存放指針,這種變量稱為指針變量。指針變量中存儲的是記憶體單元的位址。

例如 int a = 10; 假設存放a的記憶體單元塊為 101,102,103,104,占用四個位元組。如果再執行一個 int *p=&a;那麼p的值就成為101了,*p的值就是10,a的值也是10。

&是取位址運算符,擷取變量的首位址。

2、建立指針的方法是:類型說明符 *變量名,這是C定義指針變量的方法。其中*表示這個變量是指針變量。

C要求,指針必須存放在指針變量中。

一個指針隻能指向同一類型的變量。

3、指針的初始化

int *p=NULL;

int a=10;

int *p=&a;

注意:

a)未初始化的指針的系統會給一個随機的值,沒有意義,操作可能引起系統崩潰。

b)未初始化的指針應該給一個NULL值,以表明它是個空指針,表示0值。

c)不允許把常量指派給指針變量。

d)必須保持指針變量類型與所指資料的一緻性,否則會發生不可預期的效果。(雖然C已允許将任何位址指派給指針變量)。

4、取位址& 與 取内容*

取位址運算符是& ;

取内容運算符是*,注意:差別定義指針變量類型說明符*。

int *p=&a;    //定義指針變量p,并指向a;

*p=3;   //将3賦給指針p所指的記憶體單元,則a的值也變為了3

int b = *p;  //将指針p的所指記憶體單元值賦給變量b;

明白這個道理後,指針和一般變量一樣可以操作了。

指針的直接操作記憶體,在Java中是沒有的,Java沒有指針。Java中的基本變量名實際上也是記憶體位址的别名。

三、指針操作數組

1、指向數組的指針

數組是儲存在一片連續的記憶體單元中。數組名是這塊連續記憶體單元的首位址,是不可改變的常量。是以數組名也是一個常量指針。

int a[3]={1,2,3};

int *p=a;  //指向數組的指針

當指針執行數組名或數組首元素位址時,指針就指向了數組。

2、指針運算

a)自增/自減:C規定,指針加1,表示指針後一個指針的類型的記憶體單元。

b)加減整數運算,隻能加減整數,整數表示的基類型資料的寬度倍數。

c)指針相減,指針間的元素個數,不是存儲單元數。

d)指針比較,判斷指針在記憶體中的高低位置關系。

3、指針操作數組

下标發和指針法,分五種方式:

#include<stdio.h>

int main()

{

        int i,a[5]={1,2,3,4};

        int *p=a;

        for(i=0;i<4;i++)

                printf("a[%d]=%d\n",i,a[i]);

        printf("\n");

                printf("p[%d]=%d\n",i,p[i]);

                printf("*(p+%d)=%d\n",i,*(p+i));

                printf("*(a+%d)=%d\n",i,*(a+i));

                printf("*p++=%d\n",*p++);

        getch();

        return 0;

}

a[0]=1

a[1]=2

a[2]=3

a[3]=4

p[0]=1

p[1]=2

p[2]=3

p[3]=4

*(p+0)=1

*(p+1)=2

*(p+2)=3

*(p+3)=4

*(a+0)=1

*(a+1)=2

*(a+2)=3

*(a+3)=4

*p++=1

*p++=2

*p++=3

*p++=4

注意,數組名雖然是指針,但是數組名是常量,不可改變,是以不可以a++;

4、指針操作二維數組

二維數組是多個一維數組組成的數組,或者說是一維數組的數組,或者說是一維數組,但是各個元素還是一維數組。

這個概念和java中是一緻的。

假設有二維數組

int a[x][y];

那麼

a)a表示數組首位址的指針。

b)a[i]表示第i+1個一維數組,其位址為a[i],指向的是一個一維數組。

c)a[i][j] 與*(a[i]+j)、*(*(a+i)+j)是相同的,表示同一個元素。

        int a[4][5], i,j;

                for(j=0;j<5;j++)

                        a[i][j]=i*5+j;

        printf("二維數組的值為:\n");

        {

                        printf("%4d ",a[i][j]);

                printf("\n");

        }                

二維數組的值為:

     0        1        2        3        4

     5        6        7        8        9

    10     11     12     13     14

    15     16     17     18     19

5、數組指針

數組指針:變量是指針,指向了一個數組。

例如:

int *p[3];定義了一個指針p指向了一個長度為3的int數組。

        int a[4][5],i,j;

        int (*p)[5];

        p=a;

                        *(*p+j)=i*5+j;

                p++;

        }

                        printf("%4d    ",*(*p+j));

6、數組名參數

四、指針和字元串

待續。。。。

上一篇: C指針
下一篇: C指針