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

指向二維陣列的指標

    為了說明問題, 我們定義以下二維陣列:
     int a[3][4]={{0,1,2,3}, {4,5,6,7}, {8,9,10,11}};
a為二維陣列名, 此陣列有3行4列, 共12個元素。但也可這樣來理解, 陣列a由三個元素組成:a[0], a[1], a[2]。而它中每個元素又是一個一維陣列, 且都含有4個元素 (相當於4列), 例如,a[0]所代表的一維陣列所包含的 4 個元素為 a[0][0], a[0][1], a[0][2], a[0][3]。如圖5.所示:
        ┏━━━━┓   ┏━┳━┳━┳━┓
a─→ ┃ a[0] ┃─→┃0 ┃1 ┃2 ┃3 ┃
        ┣━━━━┫   ┣━╋━╋━╋━┫
        ┃ a[1]┃─→┃4 ┃5 ┃6 ┃7 ┃
        ┣━━━━┫   ┣━╋━╋━╋━┫
        ┃ a[2]┃─→┃8 ┃9 ┃10┃11┃
        ┗━━━━┛   ┗━┻━┻━┻━┛
                   圖5.
    但從二維陣列的角度來看, a代表二維陣列的首地址, 當然也可看成是二維陣列第0行的首地址。a+1
就代表第1行的首地址,a+2就代表第2行的首地址。 如果此二維陣列的首地址為1000,由於第0行有4個整型元素, 所以a+1為1008,a+2 也就為1016。如圖6.所示
                           a[3][4]
                  a    ┏━┳━┳━┳━┓
             (1000)─→┃0 ┃1 ┃2 ┃3 ┃
                  a+1 ┣━╋━╋━╋━┫
             (1008)─→┃4 ┃5 ┃6 ┃7 ┃
                  a+2 ┣━╋━╋━╋━┫
             (1016)─→┃8 ┃9 ┃10┃11┃
                       ┗━┻━┻━┻━┛
                             圖6.
    既然我們把a[0], a[1], a[2]看成是一維陣列名, 可以認為它們分別代表它們所對應的陣列的首地址, 也就是講, a[0]
代表第0 行中第 0 列元素的地址, 即&a[0][0],a[1]是第1行中第0列元素的地址, 即&a[1][0],根據地址運算規則, a[0]+1即代表第0行第1列元素的地址, 即&a[0][1], 一般而言,a[i]+j即代表第 i行第j列元素的地址, &a[i][j]
    另外, 在二維陣列中, 我們還可用指標的形式來表示各元素的地址。如前所述,a[0]與*(a+0)等價, a[1]與*(a+1)等價, 因此a[i]+j就與*(a+i)+j等價,它表示陣列元素a[i][j]的地址
    因此, 二維陣列元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j)
, 它們都與a[i][j]等價, 或者還可寫成(*(a+i))[j]
    另外, 要補充說明一下, 如果你編寫一個程式輸出列印a和*a, 你可發現它們的值是相同的, 這是為什麼呢? 我們可這樣來理解: 首先, 為了說明問題, 我們把二維陣列人為地看成由三個陣列元素a[0],a[1], a[2]組成, 將a[0], a[1], a[2]看成是陣列名它們又分別是由4個元素組成的一維陣列。因此, a表示陣列第 0行的地址, *a即為a[0], 它是陣列名, 當然還是地址, 它就是陣列第0 行第0
列元素的地址

相關推薦

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

廢話少說,先上自己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語言指標篇——陣列指標指向陣列指標變數(*p)[N]

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

為什麼不能用二級指標直接指向陣列

先上程式碼: int a[2][3]={1,2,3,4,5,6};//2行3列的int型陣列 int **pp=a;//編譯出錯,不能用二級指標直接指向二維陣列 int (*p)[3]=a;//對,p是指向一維陣列的指標,可以指向二維陣列 int *

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為二維陣列名, 此陣列有3行4列, 共12個元素。但也可這樣來理解, 陣列a由三個元素組成:a[0], a[1], a[2]。而它中每個元素又是一個

指向陣列指標變數和指向陣列指標變數---注意其指標表示

指向一維陣列的指標變數和指向二維陣列的指標變數以及指標陣列的區別 一、指向一維陣列的指標變數   設一維陣列為a[n] 定義方法:  *指標變數名 即 *P  這個p一般指向的一維陣列的首

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個空間的數組裡面存放的資

關於陣列指標的問題

#include <stdio.h> int main() { int a[3][4] = {11,23,65,85,89,98,97,68,88,66,97,100}; int *p

c++陣列指標

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

陣列指標p+1與*(p+1)

先說說a和&a的區別(有三點,三個方向): 1.是a和&a的本質,都是什麼型別的。 2.從2維陣列的角度看。 3.從指標運算的角度看。 宣告:雖然陣列名不是指標,但是用的很像指標,我們暫且把它叫做一個指標吧。 第一個問題:int a[10];  a

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

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

陣列指標的使用

# include <stdio.h> int main(void) { int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}}; printf("%0x\n", a

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重定義下型別,如

陣列指標的理解

假如有二維陣列arr[][]. arr表示陣列第一行第一個元素的地址,也可用來表示第一行的總體地址。同理的也有arr[0]。 arr+1表示二維陣列第二行第一個元素的地址,也可以用來表示第二行的總體地址。同理的也有arr[1]。 *arr 也表示二維陣列第一行第一個的首

陣列指向指標指標

一道面試題引發的問題,首先要知道[]的優先順序高於*,題目: char **p,a[6][8]; 問p=a是否會導致程式在以後出現問題?為什麼? 直接用程式說明: #include<stdio.h> void main() {     char **p,a[

指向指標指標陣列的區別

int main(){ int a[2][3]={{1,2,3},{4,5,6}}; int **p=a; cout<<**p<<endl; }       以上程式碼有沒有問題?       由於p是指向指標的指標,p指向一個int *型

指標陣列指向陣列指標 函式引數傳遞

 前兩天寫個程式,傳引數的時候想傳個二維陣列進去,結果悲劇了,函式寫成 Fun (int **p){},原來沒有這麼寫過,以為這麼寫也是對的,結果錯了,查了些資料, 做個總結。 Fun (int **p){} 這裡面的int **p //這裡的p不是二維陣列的指標,而是指向指標的指標,即二級指標。