c語言指針與數組
- **一、指針與一維數組**
- 1.一維數組的存儲方式
- 2. 對一維數組名的理解
- 3. 數組下標和指針的關系
- 4.一位數組名與取數組首地址的區別
- **二、指針與二維數組**
- 1.二維數組的存儲方式
- 2.二維數組下標和指針的對應關系
- 例題:
懷著忐忑的心情寫了人生第一篇博客......誠惶誠恐......
主要內容:本篇博客主要是較為詳細的解釋指針與一維、二維數組的聯系
一、指針與一維數組
1.一維數組的存儲方式
- 當我們定義了一個一維數組a時,編譯器就會根據數組a的類型和元素個數分配一定的內存空間(該內存單元一定是連續的),并且這個內存單元一旦分配,便不會改變。
2. 對一維數組名的理解
- 單獨的一維數組名是一個指針常量,存放的是一維數組第一個元素的地址。 例:int a[2];
對于數組a,如果我們單純只是調用數組名a,它代表著數組首個元素即a[0]的地址。
3. 數組下標和指針的關系
- 對于數組a[i],它永遠等價于*(a+i)。
4.一位數組名與取數組首地址的區別
int array[5] = {1,2,3,4,5};
printf("%d %d %d",array,,&array,&array[0]);
- 由上述代碼的輸出結果我們可以知道array、&array與&array[0]的值是一樣的。但是其意義是完全不一樣的。array和&array[0]是一樣的,代表數組首元素的地址;而&array代表整個數組的首地址。
分開來看,array是一個地址,它也可以看作為array+0,而*(array+0)又是數組第一個元素的內容,也就 是array[0],所以array就是下表為0的元素的地址。
對于&array,它是變量array的地址,而變量array的偶用范圍是四個int空間,如果我們將&array賦給某 個變量p,那么p的類型應該是:int (*)[4]; 也就是指向包含4個int數據的數組的指針。
之前看到過一個很通俗的例子:就像是陜西省政府在西安,而西安的市政府也在西安,兩個政府都在線,其 代表的意義卻完全不一樣。
二、指針與二維數組
1.二維數組的存儲方式
- 按照先后的順序依次儲存,當把每一行看作一個整體,即視為一個大的數組元素時,這個存儲的二維數組也就變成了一個一維數組了。而每個大數組元素對應二維數組的一行,我們就稱之為數組元素,顯然每個行的數 組元素都是一個一維數組。
2.二維數組下標和指針的對應關系
對于 int a[3] [3],數組名a是數組首元素的地址。
&a代表整個數組,+1直接跳到數組末,是a升一級。
a是行行指針,+1跳到下一行。
*a是第一個數的指針,+1跳到下一個數。對于二維數組每一行都對應一個行地址,二維數組的地址就是第一行地址。
行地址:
a:第一行地址。
a+1:第二行地址
a+2:第二行地址
列地址:
a[0]+0:第一列地址
a[0]+1:第二列地址
a[0]+2:第二列地址
例題:
#include <stdio.h>
int main (void)
{int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};int * pa[3] = { a[0] , a[1] , a[2] };int *p = a[0];int i;for( i=0; i<3; i++ ){printf(" %d %d %d",a[i][2-i],*a[i],*(*(a+i)+i)); printf("\n"); //*(*(a+i)+i),a+i//是矩陣a的第i行的地址,*(a+i)將被求第i行的第一個元素的地址。*(a+i)+i將被求值為第i行的第i//個元素的地址。*(*(a+i)+i)將被求值為第i行中的第i個元素的int整數值。}for( i=0; i<3; i++ ){printf("%d %d",*pa[i],p[i]);printf("\n");}return 0;
}
結果:
a[i][2-i] = 3 *a[i] = 1 *(*(a+i)+i) = 1
a[i][2-i] = 5 *a[i] = 4 *(*(a+i)+i) = 5
a[i][2-i] = 7 *a[i] = 7 *(*(a+i)+i) = 9
*pa[i] = 1 p[i] = 1
*pa[i] = 4 p[i] = 2
*pa[i] = 7 p[i] = 3