c語言的指針數組詳解
指針如何指向數組,並讀取數組中的元素:
#include <stdio.h> int main() { int arr[3] = {1,2,3}; int *p; p = &arr[0];//此句也可以寫成 p = arr; for(int i=0;i<3;i++) { printf("第%d個元素值為:%d\n",i,*(p+i)); /*應註意這裡指針的定義類型;p+i並不是指p的地址+1, 而是偏移一個類型的字節數,這裡的類型是int,所以偏移4個字節*/ } //printf("首元素為:%d\n",*p); return 0; }
指針和數組更深刻理解
#include <stdio.h> //指針可以當數組名 使用下標法 //數組名也可以像指針一樣拿來加 int main() { int arr[3] = {1,2,3}; int *p = arr; printf("%d ",*p);//這裡還可以寫成:printf(“%d “,p[0]);即把指針當成所指向的數組 printf("%d ",p[0]); printf("%d ",*(p+1)); printf("%d ",*(arr+1)); /*上面看出指針跟數組比較混,區別在下: 你可以寫*p++,但不能寫*arr++; 因為: p是一個指針變量,即保存地址的變量 arr可理解為是一個指針常量 */ putchar('\n'); printf("arr大小:%d\n",sizeof(arr)); printf("p大小:%d\n",sizeof(p));//指針就是地址,地址在os中用8個字節表示 printf("int大小:%d\n",sizeof(int)); //上面的比較可以看出數組與指針的其他區別 return 0; }
小測試:使用指針,函數封裝實現數組元素的逆序輸出
#include <stdio.h> //使用指針,函數封裝實現數組元素的逆序輸出 void getarr(int *arr,int *size) { for(int i=0;i<*size;i++) { printf("請輸入第%d個數:\n",i); scanf("%d",arr++); } } void nixuarr(int *arr,int *size) { int temp,i,j; for(i=0;i<*size/2;i++) { j = *size-1-i; temp = *(arr+i); *(arr+i) = *(arr+j); *(arr+j) = temp; } } void printarr(int *arr,int *size) { for(int i=0;i<*size;i++) { printf("%d ",*(arr+i)); } putchar('\n'); } int main() { int arr[5]; int size; size = sizeof(arr)/sizeof(arr[0]); getarr(&arr[0],&size); printf("逆序前:\n"); printarr(&arr[0],&size); nixuarr(&arr[0],&size); printf("逆序後:\n"); printarr(&arr[0],&size); return 0; }
多維數組的地址
定義一個二維數組int a[3][4]為例,其中a表示二維數組名,也是整個數組首地址;a[0],a[1],a[2]分別表示每個一維數組的名,也分別是第0、1、2列元素的地址;也就是說a[0]的值是&a[0][0],a[1]的值是&a[1][0]。其中*a是*(a+0),也就是a[0]。
例:
#include <stdio.h> int main() { int arr[3][4]={{1,2,3,4},{4,5,6,7},{5,6,7,8}}; printf("arr地址:%p,偏移一個後是%p\n",arr,arr+1);//發現此句偏移16位 printf("arr[0]地址:%p,偏移一個後是%p\n",arr[0],arr[0]+1);//此句偏移4位 printf("*(arr+0)地址:%p,偏移一個後是%p\n",*(arr+0),*(arr+0)+1);//同上一句 return 0; }
#include <stdio.h> int main() { int arr[3][4]={{1,2,3,4},{4,5,6,7},{5,6,7,8}}; int i,j; for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("地址:%p,值是%d\n",&arr[i][j],arr[i][j]); printf("地址:%p,值是%d\n",arr[i]+j,*(arr[i]+j)); printf("地址:%p,值是%d\n",*(arr+i)+j,*(*(arr+i)+j)); printf("--------------------------------------------------\n"); } } return 0; }
#include <stdio.h> int main() { int arr[3][4]={{1,2,3,4},{4,5,6,7},{5,6,7,8}}; int i,j; int (*p)[4]; p = arr; //上面這種定義叫數組指針,類似於一維數組定義一個*p //這裡的數組指針等同於二維數組名 for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("值是%d\n",*(*(p+i)+j)); } } return 0; }
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!