數組與指針
程序1
指向數組元素的指針
// 27-1指向數組元素的指針.c #include <stdio.h> main() { //定義一維數組 int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p; //定義一個整型指針 p = &a[0]; //取數組a[0]元素的內存地址 如果: p = &a[10] p++ 系統發生報錯 *p = 20; // 20 賦值給 a[0] printf("%d\n",a[0]); //輸出數組第一個元素 p++; //移動一個指向數組元素的指針,可讓他指向下一個元素 *p = 30; printf("%d\n", a[1]); }
注意:
※指針++並不是指針指向的內容++,而是指針本身++,相當於指針向前移動一個位置。
※指針每次++,並不是移動一個字節,它移動的字節數剛好為指針類型所占的字節數。每次移動多少字節,同學們也可以用sizeof函數自己測出來。
如:
double *pd;
pd++; /*pd一次移動了8字節*/
※指針一般在指向數組元素時才使用加減法,指向二維數組時還經常用到乘法
※指針的比較也就是比較兩個指針是否指向同一位置,在指向數組元素的指針中經常用來測試兩個指針是否指向同一數組元素。
內存計算
定義double arr[1000];將占用8*1000=8000=8K的內存,可用sizeof(arr)自己試試。
定義一個指針變量,要消耗4個字節的內存。
指針數組
格式:
int *a[10]; //相當於定義了十個元素都是指針類型
定義變量時,雖然各運算符意義不同,但同樣符合C語言的運算符優先級。
在這里a先與[10]結合,表示a是個數組,再與int*結合,表示數組的每個元素都是int*型,也就是int型指針。
程序2
指針數組
// 27-2指針數組.c #include <stdio.h> main() { int a, b; int *pa[10]; //定義指針數組 pa[3] = &a; //取變量a的地址 pa[6] = &b; //取變量b的地址 a = 40; b = 50; printf("pa[3] = %d ,pa[6] = %d \n", *pa[3], *pa[6]); //輸出值 }
指向數組的指針
格式:
int (*a)[10];
a先與*結合,表示a是個指針,再與[10]結合,表示它指向有10個元素的數組,再與int結合,表示這個數組是int型。
程序3
指向數組的指針
// 27-3指向數組的指針.c // #include <stdio.h> main() { int a[10] = {1,2,3,4,5}; int(*pa)[10]; //pa 是個指向有10個元素數組的指針 pa = &a; printf("%d\n", (*pa)[2]); //星號取值 }
切割記憶法:
*a: a先與*結合,不管兩旁有什么東西,表示a只是“1個”指針,指向什么,以后再說。
a[10]: a先與[10]結合,表示a有“10個”元素,這10個元素是什么類型,以后再說。
數組名與指針
程序4
數組名與指針
// 27-4數組名與指針.c #include <stdio.h> main() { int a[10] = {10,1,2,3,4,5}; int *pa = a; // 數組a是一個指針 //*(pa+0) = *pa 指向數組第一個元素。數組名可直接當指針使用,*(a+0) = *a 指向數組第一個元素 printf("%d,%d,%d\n",*(pa+0),*(a+0),*a); printf("%d\n", *(pa + 3)); }
※數組名實際上是個只讀指針,[n]運算早就被C語言的設計者設計好,在電腦中取a[n]的值相當於*(a+n)
*(a+n)與*a+n區別:
※數組名與指針的差別是:數組名是只讀的,而指針可以改寫。
假設a是數組名,p是指針,p++就可以,a++就不行。
※因為a[0]等價於*(a+0)等價於*a,所以&a[0]與 a意義相同。因此p=&a[0]和p=a效果一樣。
++的分解
假如p是一個賦了值的char型指針,如果遇到如下表達式
char a=*p++;
可分解為:
char a=*p;
p=p+1;
第二種情況:
char a=*++p;
可分解為
p=p+1;
char a=*p;
第三種情況:
char a=(*p)++;
可分解為
char a=*p;
(*p)=(*p)+1;
第四種情況:
char a=++(*p);
可分解為
(*p) = (*p) +1;
char a=(*p);
圖表總結
用指針輸出一個數組中的全部元素
// 27-5用指針輸出一個數組中的全部元素.c。 #include <stdio.h> main() { //定義一個普通的整形數組 int a[6] = { 0,1,2,3,4,5 }; //指向數組元素的指針輸出 int *pa; printf("\"指向數組元素的指針:\"\n"); for (int i = 0; i < 6; i++) { pa = &a[i]; printf("%d ", *pa); } printf("\n\n"); //指針數組輸出 int *pa1[10]; printf("\"指針數組:\"\n"); for (int i = 0; i < 6; i++) { pa1[i] = &a[i]; printf("%d ", *pa1[i]); } printf("\n\n"); //指向數組的指針輸出 int(*pa2)[6]; printf("\"指向數組的指針:\"\n"); pa2 = &a; for (int i = 0; i < 6; i++) { printf("%d ", (*pa2)[i]); } printf("\n\n"); //數組名與指針輸出 int *pa3 = a; printf("\"數組名與指針輸出:\"\n"); for (int i = 0; i < 6; i++) { printf("%d ", *(pa3++)); } }