1. 程式人生 > 其它 >bootstrap var一個數組_陣列指標詳解

bootstrap var一個數組_陣列指標詳解

技術標籤:bootstrap var一個數組

文章部分資料來源:

Pointer to an Array | Array Pointer - GeeksforGeeks​www.geeksforgeeks.org d3cd39b6f40d94abc78a8152f4f7a2d5.png

介紹陣列指標之前,先來回顧指標:

int var=20;
int *p;
p=&var;
*p=10;
printf("%d",var);
輸出10

int var=20; //var是變數,普通變數存放的是實際的值

int *p; //*p是指標,指標變數存放的是地址

指標變數有型別,即指標存放的地址指向的資料型別

其中,*用來訪問指標的值所表示的地址上的變數

p=&var; //p的值是var的地址,指標變數的值是具有實際值的變數的地址

其中,&用來取得變數的地址

此時,我們可以得到*p=var,它們完全等價,具體原理可以寫成:

*(訪問指標的值所記錄的地址)+p(p的地址)=var

考慮以下程式:

#include<stdio.h> 
  
int main() 
{ 
  int arr[5] = { 1, 2, 3, 4, 5 }; 
  int *ptr = arr; 
  
  printf("%pn", ptr); 
  return 0; 
}

ptr指標指向陣列第0個元素的地址。

我們可以宣告一個指標,指向整個陣列,它與指向一個元素的指標不同。

int (*ptr)[10];

ptr指標指向陣列中的10個整數。由於[]的優先順序高於*,為防止定義指標陣列,應加小括號。ptr的型別是“指向陣列中10個整數的指標”。

指向陣列第0個元素的指標和指向整個陣列的指標完全不同。它們的型別不同,當p為int型指標,p++移動4個位元組;當p為int (*p)[5]型指標時,p++移動20個位元組

指標和二維陣列

在二維陣列中,我們可以使用兩個下標訪問每個元素,其中第一個下標表示行號,第二個下標表示列號,記為a[i][j]

定義一個二維陣列

int arr[3][4]={{1,2,3,4}{5,6,7,8}{9,10,11,12}}

8d705c0558a1ae53525d5894a068a2ce.png

由於計算機中的記憶體是線性組織的,因此無法將二維陣列儲存在行和列中。行和列的概念僅是理論上的,實際上,二維陣列是以行優先的順序儲存的,即行彼此相鄰放置。下圖顯示瞭如何將上述二維陣列儲存在記憶體中。

e617bf24bb52cf01fcf6a415b79ccff6.png

每一行都可以視為一維陣列,因此二維陣列可以視為一維陣列的集合,這些維陣列彼此並排放置。換句話說,我們可以說二維維陣列是一個接一個地放置的。因此,這裡的arr是3個元素的陣列,其中每個元素都是4個整數的一維陣列。

在我們正式開始討論之前,宣告一些共識:

①陣列變數的名字表達第一個元素的地址,但是陣列的元素表達的是變數,需要&取地址

②[]運算子可以用於指標,與*功能類似。p[0]=*p,p[0]意為取p地址上的第一個整數

運算子可以用於陣列。*a=a[0],*a意為取訪問a陣列的第一個整數。

對於陣列而言,a[i]=*(a+i)

③陣列的名字是常量指標。int a[]=int * const a,故陣列變數不能被賦值

下面我們正式開始討論

一、地址

陣列的名字是一個常量指標,指向第0個數組。arr是“指向4個整數的陣列的指標”,arr+1表示指標指向了下一行,如圖所示

94a7235a45b6afaf9410d6d6769c40af.png

①arr指向了陣列中第0行的地址

②*arr指向了陣列中第0行第0列元素的地址

③arr+i&arr[i]指向了陣列中第i行的地址,它的型別是“指向4個整數的陣列的指標”

④*(arr+i)arr[i]&arr[i][0]表示陣列中第i行第0列元素的地址,它的型別是"int指標"

⑤*(arr+i)+j arr[i]+j&arr[i][j]&(*(arr+i))[j]&arr[0][0]+i*每個一維陣列中元素個數+j表示了第i行第j列的元素地址

二、值

元素a[i][j]的幾種等價的引用方式

①有&去掉&就是值

②沒有&在地址前再加*就是值

三、變數的定義

int a[2][3]={10,20,30,40,50,60};

int *p=a[0]// 定義列指標

int (*p)[3];p=a;//定義行指標

拓展閱讀:

雨微藍:小甲魚S1E24指標和二維陣列​zhuanlan.zhihu.com zhihu-card-default.svg