1. 程式人生 > >指標和陣列的關係

指標和陣列的關係

指標是一個值為地址的變數,即儲存地址的變數,地址沒有資料型別之說,char *,int *都是一樣的長度,跟機器有關。

int *a表示a地址處儲存的值為整型。

指標的初始化

int a = 10;
int *b = &a;

 或者

1 int a = 10;
2 int *b;
3 b = &a;

指標的解引用

通過*b,可以對指標b進行解引用(間接訪問)從而訪問得到a的值。在指標解引用之前需要對它進行檢查,判斷b是否為NULL

指標常量和常量指標

int *p表示指向整型的指標,也叫整型指標,int const *p和int * const p兩個變數則不同,根據const和*的順序,int const *p中表示常量指標,int * const p表示指標常量,其中常量指標也可寫作const int *p。

常量指標(與整型指標類比),表示指標指向的值是常量,不可修改。指標常量,表示指標是常量,地址不可修改。

1 int a,b;
2 
3 int * const p = &a; //指標常量
4 *p = 9; //操作成功
5 p = &b; //操作錯誤
6 
7 int const * m = &a; //常量指標
8 *m = 9; //操作錯誤
9 m = &b; //操作成功

指向常量的指標常量該怎麼寫? 

 1 const int * const b = &a;//指向常量的指標常量 

 

陣列

1.一維陣列

int b[10],其中陣列名b的值表示一個指標常量,是整個陣列的地址,也是第一個元素的地址,該地址不可修改,但所指向的值可以修改。

當陣列名在表示式中使用時,編譯器為它產生一個指標常量,除了兩種情況陣列名不用指標常量來表示:sizeof和&。sizeof返回整個陣列的長度(以位元組為單位),而不是指向陣列的指標的長度。&取一個數組名的地址所產生的是一個指向陣列的指標,而不是一個指向指標常量的指標。

1 int a[10];
2 int *c;
3 
4 c = &a[0]; //第一個元素的地址
5 c = a; //陣列的地址
6 
7 a = c; //錯誤,陣列名是常量指標,該值不可修改
8 *a = 1;//指向的值可以修改

2.一維陣列下標訪問和指標間接訪問

宣告一個數組a,a和&a[0]表示同一個地址,對陣列中的值進行訪問時,*a和a[0]都表示第一個元素,*(a+n)和a[n]同。

 1 int a[10] = {0,1,2,3,4,5,6,7,8,9};
 2 
 3 int *b = a+1; //b指向a[1]
 4 //int *b = &a[1];
 5 
 6 //從b的角度訪問
 7 printf("%d", *b++);
 8 printf("%d", b[0]);
 9 printf("%d", b[-1]);
10 
11 
12 //從a的角度訪問
13 printf("%d", a[n]);
14 printf("%d", *(a+n));

上述程式碼中3、4兩條語句表示的意思相同,表示b指向a[1]。C的下標引用和間接訪問表示式是一樣的

3.二維陣列

 

4.一維陣列下標訪問和指標間接訪問

 

指標和陣列

指標和陣列不是相等的,陣列具有確定數量的元素,指標只是一個標量值,

 

指向指標的指標和指向陣列的指標