指針與數(shù)組
指針數(shù)組乃摹,數(shù)組指針,指針法訪問數(shù)組跟衅,分不清如何使用孵睬,下面將幫你疏通思路,更好理解他們的關系与斤。
數(shù)組名的本質
int array[5];
printf("array = %o\n",array);
printf("&array = %o\n",&array);
printf("&array[0] = %o\n",&array[0]);
由結果可以得知肪康,數(shù)組名是一個地址,指向數(shù)組的首地址撩穿。那樣我們就可以通過指針來操作數(shù)組元素磷支。
指針法操作數(shù)組元素
可以通過*array來操作數(shù)組的首元素,但如果想要操作第二個元素食寡,要怎么辦呢雾狈?地址也是可以進行運算操作的,通過改變地址的值來指向不同的內存抵皱,這樣就有可能操作數(shù)組的第二個元素善榛。
首先看看數(shù)組的元素地址
可以看到數(shù)組元素地址是一段連續(xù)的地址辩蛋,這樣就有可能通過知道數(shù)組首地址,來操作數(shù)組的所有元素移盆。上面的地址增量是4個字節(jié)悼院,聯(lián)想到該數(shù)組是int型,int型在32位平臺占4個字節(jié)咒循,所以這個增量是要看數(shù)組元素數(shù)據(jù)類型据途。
int array[5];
int *ptr = array;
printf("ptr = %o\n",ptr);
printf("ptr+1 = %o\n",ptr+1);
可以看到ptr+1后地址開始由30177370變化為30177374,增量為4叙甸,這是為什么呢颖医?這就有關指針步長了。指針步長指指針加1的長度增量裆蒸∪巯簦可以看到此時步長為4,4這個數(shù)字很熟悉僚祷,ptr是整型指針佛致,整型在32位平臺中占4個字節(jié),和ptr指向的數(shù)組的元素地址增量一致久妆。那么就可以通過指針來操作數(shù)組元素晌杰。所以對應類型的指針指向對應類型的數(shù)據(jù),不然可能會出錯筷弦。
*(ptr+1) = 2;
*(ptr+2) = 3;
也可以使用[ ]的形式操作肋演, *與[ ]的效果一樣,編譯器內部做了處理烂琴。
ptr[1] = 2;
ptr[2] = 3;
這種形式看起來ptr是一個數(shù)組名爹殊,閱讀體驗也不錯。我一般是使用這種形式奸绷。但不能把ptr當作是一個數(shù)組梗夸,他本質還是一個指針。
指針步長在一維數(shù)組與二維數(shù)組
一維數(shù)組
int array[5] = {1,2,3,4,5};
printf("array: %u array+1: %u\n",array,array+1);
printf("&array: %u &array+1: %u\n",&array,&array+1);
printf("sizeof(array) = %d\n",sizeof(array));
可以看到array與&array的指針步長不一樣号醉,array的步長為一個元素的字節(jié)數(shù)反症,&array的步長為一個數(shù)組的長度。
array是這個數(shù)組的首元素地址 +1的長度為一個數(shù)據(jù)類型長度
&array是這個數(shù)組的首地址 +1的長度為·一個數(shù)組類型長度
二維數(shù)組
int array[2][3] = {1,2,3,4,5,6};
printf("array[0]: %u array[0]+1: %u\n",array[0],array[0]+1);
printf("array: %u array+1: %u\n",array,array+1);
printf("&array: %u &array+1: %u\n",&array,&array+1);
printf("sizeof(array) = %d\n",sizeof(array));
printf("sizeof(array[0]) = %d\n",sizeof(array[0]));
&array 這個二維數(shù)組的首地址 指針步長為整個二維數(shù)組
array 這個二維數(shù)組的首行地址畔派,指針步長為每行的一維數(shù)組長度
*array 首行首元素地址铅碍,指針步長為元素的數(shù)據(jù)長度
*array 這個數(shù)組的首行首元素數(shù)據(jù)
這個對照array[ ]表示法就可以明白了,等同于[ ]线椰。
*array == array[0] 就表示首行首元素地址胞谈。也可以是 &array[0][0],&與一個[ ]抵消。
**array == array[0][0] 這樣就很好理解了
注意事項
數(shù)組名不可以為左值,數(shù)組名雖然本質是一個地址烦绳,但這個只可以讀卿捎,不可以修改。
int array1[5];
int array[5];
int *ptr = array1;
array = ptr; //error,編譯出錯
指針與數(shù)組的簡單介紹到此結束