c语言指针和数组的联系
生活随笔
收集整理的這篇文章主要介紹了
c语言指针和数组的联系
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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總結
以上是生活随笔為你收集整理的c语言指针和数组的联系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优盘不能正常退出 怎么办 优盘无法安全拔
- 下一篇: win8联想怎么u盘启动bios设置方法