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、數組名參數
四、指針和字元串
待續。。。。