用指標訪問一維陣列
數組裡面所有的元素是連續的記憶體存放的,陣列名是陣列第一個位元組的記憶體地址,並且陣列名a也表示指標,在表示式可以被轉換為和 p 等價的指標!a作為右值 並不表示a地址儲存的內容, 而是陣列首元素首地址
指標進行加法(減法)運算時,它前進(後退)的步長與它指向的資料型別有關。p指向的資料型別是int ,在記憶體中佔4個位元組(Byte) ,p+1表示前進4個位元組。
用指標訪問二維陣列先看看常見指標變數的定義:
int a[2][3] = { { 2,3,6 },{ 4,5,8 }}; int(*p)[3] = a;//陣列指標,指向一維陣列的指標, printf("a=%p &a[0]=%p\n", a, &a[0]);//400 printf("*a=%p a[0]=%p &a[0][0]=%p\n", *a, a[0],&a[0][0]);//400 一維陣列首元素的首地址 //使用整個陣列的資料沒有實際的含義,編譯器遇到這種情況都會轉換為指向該一維陣列第 0 個元素的指標 printf("(a+1)=%p &a[1]=%p\n", a + 1, &a[1]);//412 printf("*(a+1)=%p a[1]=%p &a[1][0]=%p\n",*(a + 1), a[1], &a[1][0]);// printf("*(a+1)+2=%p a[1]+2 = %p &a[1][2]=%p\n",*(a + 1) + 2,a[1] + 2,&a[1][2]);//420 printf("*(*a+1)=%d *(a[0]+1)=%d a[0][1]=%d", *(*a + 1), *(a[0] + 1),a[0][1]);//3
指標進行加法(減法)運算時,它前進(後退)的步長與它指向的資料型別有關
p的資料型別為int (*) [3],一維陣列a[0]有3個整型資料就是12個位元組,a+1 = 412
a[0]的資料型別為int *
一個小練習:打印出字串指標陣列中每一個字元指標法:字串相當於一個一位陣列
#include<stdio.h>int main(){ char * array[5] = { "array","11","kankanshisha","pointer","c program" }; char * (*p) = array;//指向陣列元素(char指標型別)的首地址的指標 for (int i = 0; i < 5; i++) { for (int j = 0; '\0' != *(*(p + i) + j); j++) { printf("%c", *(*(p + i) + j)); } printf("\n"); } return 0;}
陣列下標法:
#include<stdio.h>int main(){ char * array[5] = { "array","11","kankanshisha","pointer","c program" }; char * (*p)[5] = &array;//指向陣列首地址的指標 (*p)===陣列名字array for (int i = 0; i < 5; i++) { for (int j = 0; (*p)[i][j]!='\0'; j++) { printf("%c", (*p)[i][j]); } printf("\n"); } return 0;}