1. 程式人生 > >C/C++指向二維陣列的指標

C/C++指向二維陣列的指標

1. 二維陣列

  設有整型二維陣列a[3][4]如下:
    0 1 2 3
    4 5 6 7
    8 9 10 11
  它的定義為:
      int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}
 設陣列a的首地址為1000,各下標變數的首地址及其值如圖所示。

 這裡寫圖片描述
  C語言允許把一個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a[0]、a[1]、a[2]。每一個一維陣列又含有四個元素。
  陣列及陣列元素的地址表示如下:從二維陣列的角度來看,a是二維陣列名,a代表整個二維陣列的首地址,也是二維陣列0行的首地址,等於1000。a+1代表第一行的首地址,等於1008。如圖:

這裡寫圖片描述
  a[0]是第一個一維陣列的陣列名和首地址,因此也為1000。*(a+0)或*a是與a[0]等效的, 它表示一維陣列a[0]0 號元素的首地址,也為1000。&a[0][0]是二維陣列a的0行0列元素首地址,同樣是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。
  同理,a+1是二維陣列1行的首地址,等於1008。a[1]是第二個一維陣列的陣列名和首地址,因此也為1008。&a[1][0]是二維陣列a的1行0列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。
  由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。
  此外,&a[i]和a[i]也是等同的。因為在二維陣列中不能把&a[i]理解為元素a[i]的地址,不存在元素a[i]。C語言規定,它是一種地址計算方法,表示陣列a第i行首地址。由此,我們得出:a[i],&a[i],*(a+i)和a+i也都是等同的。
  另外,a[0]也可以看成是a[0]+0,是一維陣列a[0]的0號元素的首地址,而a[0]+1則是a[0]的1號元素首地址,由此可得出a[i]+j則是一維陣列a[i]的j號元素首地址,它等於&a[i][j]。
  由a[i]=*(a+i)得a[i]+j=*(a+i)+j。由於*(a+i)+j是二維陣列a的i行j列元素的首地址,所以,該元素的值等於*(*(a+i)+j)。

2. 指向陣列的指標變數

  把二維陣列a分解為一維陣列a[0]、a[1]、a[2]之後,設p為指向二維陣列的指標變數。可定義為:
  int (*p)[4]
  它表示p是一個指標變數,它指向包含4個元素的一維陣列。若指向第一個一維陣列a[0],其值等於a,a[0],或&a[0][0]等。而p+i則指向一維陣列a[i]。從前面的分析可得出*(p+i)+j是二維陣列i行j 列的元素的地址,而*(*(p+i)+j)則是i行j列元素的值。
  二維陣列指標變數說明的一般形式為:
   型別說明符 (*指標變數名)[長度]
  其中“型別說明符”為所指陣列的資料型別。“*”表示其後的變數是指標型別。“長度”表示二維陣列分解為多個一維陣列時,一維陣列的長度,也就是二維陣列的列數。應注意“(*指標變數名)”兩邊的括號不可少,如缺少括號則表示是指標陣列(本章後面介紹),意義就完全不同了。

相關推薦

C 語言中陣列指標詳解

C語言中,指標是一個複雜但又靈活多變的知識點,我們知道,在一維陣列中,對於一個數組a[],*a,a,&a,都表示a的首地址,但如果與二維陣列混合使用,就顯得更為複雜了。例如對於一個二維陣列  a[2][4]={{1,2.3},{4,5,6}}  a+i,&a

C/C++函式返回陣列指標問題

方法1:需要對指標有較好的理解int(*f())[2]{int (*m)[2]=new int[2][2];m[0][0]=1;m[0][1]=0;m[1][0]=2;m[1][1]=0;return m;}//總感覺這種函式定義很怪,可以使用typedef重定義下型別,如

c語言指標篇——陣列指標指向陣列指標變數(*p)[N]

陣列指標 首先,我們先介紹一下二維陣列和二維陣列的指標,二維陣列相當於一個特殊的一維數組裡面每個元素又是一個一維陣列,例如:int a [ 3 ] [3],可以看成一個3行的一個列陣列,每一列的元素又是一個長度為3的陣列,陣列名的一個特殊一維陣列的首地址,如

C/C++指向陣列指標

1. 二維陣列   設有整型二維陣列a[3][4]如下:     0 1 2 3     4 5 6 7     8 9 10 11   它的定義為:

9、C語言中陣列陣列名及指向陣列指標變數

#include <stdio.h> #include <stdlib.h> //與二維陣列相關的指標變數([] 比 *優先順序高) //在一般指標變數指向二維陣列,或者n維陣列,要直接操作a[i][j],對指標的操作必須有兩個符號(其中不出現&,如果有&則相應的加

C語言陣列指標練習

描述 程式填空,使其輸出結果是: 1,2,3,4, 10,12,14,16, 18,20,11,12, #include <iostream> using namespace std; void Double(int * p, int n) { for(int i = 0;i

C語言陣列篇(五)多級指標陣列指標的區別

多級指標   以二級指標為例 二級指標的由來是 指標陣列 的指標形式. int *p[10] 讀取的順序是 p[10] --> 10個空間的陣列 * p[10] --> 這10個空間的數組裡面存放的資

c++陣列指標

1.定義指標指向二維陣列 為了方便根據使用者輸入動態定義二維陣列的行和列,引入變數rowsNum(行),colsNum(列)。 以定義5行4列的二維陣列為例, int rowsNum = 4; int colsNum = 5; float** a = new flo

C/C++建立陣列/指標陣列

三個方法: 1.用兩層vector模版直接做。2.用一維陣列模擬二維,即int * p = new int [x * y];分配一個x * y大的陣列,然後要用的時候把二維下標對映到一維中,這樣做的最大好處是,分配的陣列空間是連續的,像一個真正的二維陣列,缺點是用起來不像二

C語言】陣列解魔方陣

解題思路: 魔方陣的排列規律如下(思路來自網際網路): 注意:剛開始我也沒看懂,但是相信我多看幾遍理解已經能看懂的。 如3×3的魔方陣:      8   1   6  &nbs

C++中有關陣列的問題

1.[錯誤] 無法將 “int () [3]” 轉換為 “int () [100]”, 用於引數 “1” 到 “void 替換” (int (*) [100], int, int) " 問題:無法直接將int a[][]作為引數 原因:二維陣列中是按一行一行進行儲存,儲存在連續的記憶體地址中

C++中有關陣列

[錯誤] 無法將 “int () [3]” 轉換為 “int () [100]”, 用於引數 “1” 到 “void 替換” (int (*) [100], int, int) " 問題:無法直接將int a[][]作為引數 原因:二維陣列中是按一行一行進行儲存,儲存在連續的記憶體地址中。如

C語言傳遞陣列

方法一, 形參給出第二維的長度。 例如: #include <stdio.h> void func(int n, char str[ ][5] ) { int i; for(i = 0; i < n; i++) printf("/nstr[%d] = %s/n"

C++ 動態申請陣列陣列傳參

以往在C++的學習中我們知道: int *ptr = new int; 這樣可以動態分配一個int型指標 int *ptr = new int[3]; 這樣可以動態分配一個一位陣列 但是如何動態分配一個二維陣列呢?像這樣: int *ptr = new int[3][3] ?執行

C語言)陣列按行分別排序

//傳遞“指標陣列”方法#include <stdio.h> //排序函式,分別對每一行的元素進行排序 void sort(int *a[],int row,int col) { int i,j,k,temp; for(i=0; i<row; i++) {

C#如何獲取陣列的行列數

本來是想在unity2D中利用二維陣列儲存平面上網格佔用情況的。忽然發現忘了怎麼獲取二維陣列的行列數了,在這裡記錄一下這些函式(雖然完成任務也可不依靠這些函式)。 在二維陣列中我們可以利用GetUpperBound()來獲取行列數。 例子如下 namespace T

PTA - C程式設計 NoA - 陣列 (10道題)

應該是第10次上機題目了,本次共10道題(由於具體輸入輸出的樣例題目中都有,就不在部落格裡佔篇幅複製貼上了,只把題題目和要求賦值過來): 7-1 求矩陣的區域性極大值 7-2 矩陣運算 7-3

指標指標指向陣列的一些問題

廢話少說,先上自己Dev c++上的程式碼: #include<stdio.h>int main (){int c[2][3]={15,2,3,4,5,6},*p,(*rp)[3],*q,i; p =(int*)c; rp=c; q=c;

C語言基礎-----陣列,三陣列

一 二維陣列 1.二維陣列的定義: 資料型別  陣列名[行][列] ={ 數值1,數值2......}; 2.二維陣列有幾行,就代表有幾個一維陣列. int a[2][3] = {1,2,3,4,5,

C語言為陣列動態分配記憶體的問題

C語言中動態分配一位陣列是很簡單的,但是沒有可以直接對二維陣列進行動態分配的函式,因此,要相對二維陣列動態分配記憶體,便要藉助於一位陣列來實現,具體如下: 假設要為一個n*m的二維陣列分配動態