[转载]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 a=10; 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");
????????for(i=0;i<4;i++)
????????????????printf("p[%d]=%d\n",i,p[i]);
????????printf("\n");
????????for(i=0;i<4;i++)
????????????????printf("*(p+%d)=%d\n",i,*(p+i));
????????printf("\n");
????????for(i=0;i<4;i++)
????????????????printf("*(a+%d)=%d\n",i,*(a+i));
????????printf("\n");
????????for(i=0;i<4;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)是相同的,表示同一個元素。 #include<stdio.h>
int main()
{
????????int a[4][5], i,j;
????????for(i=0;i<4;i++)
????????????????for(j=0;j<5;j++)
????????????????????????a[i][j]=i*5+j;
????????printf("二維數組的值為:\n");
????????for(i=0;i<4;i++)
????????{
????????????????for(j=0;j<5;j++)
????????????????????????printf("%4d ",a[i][j]);
????????????????printf("\n");
????????}????????????????
????????getch();
????????return 0;
} 二維數組的值為:
???? 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數組。 #include<stdio.h>
int main()
{
????????int a[4][5],i,j;
????????int (*p)[5];
????????p=a;
????????for(i=0;i<4;i++)
????????{
????????????????for(j=0;j<5;j++)
????????????????????????*(*p+j)=i*5+j;
????????????????p++;
????????}
????????printf("二維數組的值為:\n");
????????p=a;
????????for(i=0;i<4;i++)
????????{
????????????????for(j=0;j<5;j++)
????????????????????????printf("%4d????",*(*p+j));
????????????????printf("\n");
????????????????p++;
????????}????????????????
????????getch();
????????return 0;
} 二維數組的值為:
???? 0????????1????????2????????3????????4
???? 5????????6????????7????????8????????9
????10???? 11???? 12???? 13???? 14
????15???? 16???? 17???? 18???? 19 6、數組名參數 指針變量 p 是空指針的判斷:
if ( p == 0 )
if ( p == '\0' )
if ( p == 3 - 3 )
if ( p == NULL )??/* 使用 NULL 必須包含相應的標準庫的頭文件 */
if ( NULL == p )
if ( !p )
if ( p == q )
...
指針變量 p 不是空指針的判斷:
if ( p != 0 )
if ( p != '\0' )
if ( p != 3 - 3 )
if ( p != NULL )??/* 使用 NULL 必須包含相應的標準庫的頭文件 */
if ( NULL != p )
if ( p )
if ( p != q )
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");
????????for(i=0;i<4;i++)
????????????????printf("p[%d]=%d\n",i,p[i]);
????????printf("\n");
????????for(i=0;i<4;i++)
????????????????printf("*(p+%d)=%d\n",i,*(p+i));
????????printf("\n");
????????for(i=0;i<4;i++)
????????????????printf("*(a+%d)=%d\n",i,*(a+i));
????????printf("\n");
????????for(i=0;i<4;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)是相同的,表示同一個元素。 #include<stdio.h>
int main()
{
????????int a[4][5], i,j;
????????for(i=0;i<4;i++)
????????????????for(j=0;j<5;j++)
????????????????????????a[i][j]=i*5+j;
????????printf("二維數組的值為:\n");
????????for(i=0;i<4;i++)
????????{
????????????????for(j=0;j<5;j++)
????????????????????????printf("%4d ",a[i][j]);
????????????????printf("\n");
????????}????????????????
????????getch();
????????return 0;
} 二維數組的值為:
???? 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數組。 #include<stdio.h>
int main()
{
????????int a[4][5],i,j;
????????int (*p)[5];
????????p=a;
????????for(i=0;i<4;i++)
????????{
????????????????for(j=0;j<5;j++)
????????????????????????*(*p+j)=i*5+j;
????????????????p++;
????????}
????????printf("二維數組的值為:\n");
????????p=a;
????????for(i=0;i<4;i++)
????????{
????????????????for(j=0;j<5;j++)
????????????????????????printf("%4d????",*(*p+j));
????????????????printf("\n");
????????????????p++;
????????}????????????????
????????getch();
????????return 0;
} 二維數組的值為:
???? 0????????1????????2????????3????????4
???? 5????????6????????7????????8????????9
????10???? 11???? 12???? 13???? 14
????15???? 16???? 17???? 18???? 19 6、數組名參數 指針變量 p 是空指針的判斷:
if ( p == 0 )
if ( p == '\0' )
if ( p == 3 - 3 )
if ( p == NULL )??/* 使用 NULL 必須包含相應的標準庫的頭文件 */
if ( NULL == p )
if ( !p )
if ( p == q )
...
指針變量 p 不是空指針的判斷:
if ( p != 0 )
if ( p != '\0' )
if ( p != 3 - 3 )
if ( p != NULL )??/* 使用 NULL 必須包含相應的標準庫的頭文件 */
if ( NULL != p )
if ( p )
if ( p != q )
總結
- 上一篇: 两个指针变量可以相减
- 下一篇: win8 关于Adobe CS6系列软件