指向多維陣列的指標問題,C語言中對指向多維陣列的指標陣列中多維陣列元素的間接定址問題

2022-09-03 08:15:08 字數 5805 閱讀 3409

1樓:匿名使用者

int multi[3][4]; //這是乙個二維陣列,具有3行4列

int(*ptr)[4]; //定義ptr是乙個可以指向一行具有4個元素的行指標變數,即,

//例如,二維陣列multi[3][4]可以看成是3個一維陣列(每個陣列4個元素)疊加構成,

//則其陣列名就為multi[0],multi[1],multi[2],又是乙個一維陣列,

//只不過該一維陣列的元素值不是數值,而是具有4個元素的一維陣列的首位址,

//所以ptr就是乙個指向一行具有4個元素的行指標變數,也相當於乙個二級指標變數

2樓:豬豬豬

int *ptr[4]; <=> int ptr[4][n] //這裡只是解釋而不能夠宣告

int (*ptr)[4]; //這裡就不一樣了,*pt相當於乙個變數,int (*ptr)[4]; 與int p[4];作用是等同的都是一位陣列,只是ptr指向(*ptr)的位址罷了!

3樓:匿名使用者

int 說明型別是整數

[4]說明這是個一維陣列

*ptr說明ptr是乙個指標

合起來的意思就是:

宣告了 乙個指向大小為4的一維整形陣列的指標

普通的指標變數可以指向二維陣列嗎?

4樓:麥香甜甜圈

當然可以。因為二維陣列在記憶體中也是按照一維方式存放的(記憶體單元是一維的)。下面有個參考程式你可以試試。

#include

void main()

;int *p=a;

printf("%d\n",*p);//結果輸出1,將*p改寫成*(p+1)則輸出2,改寫成*(p+7)則輸出8,可見*p可以指向二維陣列中的任何乙個元素。}

5樓:匿名使用者

二維陣列是指標的指標

它本身是個指標,指向乙個指標陣列,該指標陣列的每個元素都是個指標,指向該行(或者列)的第乙個元素

6樓:未曾冷卻

可以只要資料型別能夠配套就可以了

二維陣列的資料型別也是int

所以int型的指標可以用

7樓:

可以,二維陣列其實還是一維陣列,沒有本質的區別。

比如 int a[3[4];

我們可以

int *p = &a[0][0];

這樣可以用p直接訪問a;

而且2樓的說法欠妥,二維陣列不是指向指標的指標,他只有乙個指標,指向某段記憶體,而且此段記憶體記憶體的是資料,而非指標。

8樓:影豐

可以c中沒有真正意義上的二維陣列,是通過一維陣列擴充套件實現的,陣列的每一項再存放指向一維陣列的手指標。例如:

int a[4][5];

int (*p)[5]

p=a這裡的p即為a[4]的首位址,也就是說p指向了4*5的陣列,指標裡的5表示第二維度陣列的長度即第一行資料的個數,如果b中int (*p)[<5],則會不夠儲存a中陣列第二維度的長度,就會出錯。

最終儲存的二維陣列將會全部成一維陣列,所以你直接申明int *p 指向該二維陣列,那麼這裡的p即為a[0][0],p+6即為a[1][0]

c語言中對指向多維陣列的指標陣列中多維陣列元素的間接定址問題

9樓:

可以從一維陣列開始看最簡單。

int *a = new int[5];

a代表第乙個元素的位址,所以第乙個後面第n個可以用 *(a+n);

二維陣列

int **a = new int[5][5];

a[i] 相當於一維陣列裡的 a, 它代表指向第一行元素的乙個陣列指標。

即:a[i] ( *a ) 是 int* 型所以指向第 2 行 陣列 的指標: *(a+1)指向第 i 行 第 j 列 陣列 元素 的指標 (從0開始算) *( *(a+i) + j ) 或者 *( a[i] + j )

指向結構體的指標

c語言指向多維陣列的指標問題?

10樓:匿名使用者

a=a[0] ->a[0][0] a[0][1] a[0][2]a[1] a[1][0] a[1][1] a[1][2]a[2] a[2][0] a[2][1] a[2][2]二維陣列首位址 就是二維常量指標

a可以看成是 一維指標陣列a[3]的首位址即 a的值是 a[0], a[0]的值是 a[0][0] 的位址a+1的值是 a[1], a[1]的值是 a[1][0] 的位址a+2的值是 a[2], a[2]的值是 a[2][0] 的位址

11樓:金色潛鳥

列印出來看一下數值排列,和位址就懂了。

#include

main()

;int i,j;

for(j=0;j<3;j++)

for(j=0;j<3;j++)

return 0;}

a + 2 -- 是 int a 的位址 加 2 * sizeof(int)

12樓:匿名使用者

把你這個a二維陣列看成3行4列,a + 數字話,可以理解成以行移動,a[i] +數字的話以列移動

13樓:仒雨

額,a+2不是指向a[0][2]麼?

無論是幾維陣列,在記憶體中都是順序存放的

指向二維陣列的指標

14樓:小舅舅有點帥

int(*p)[10]定義了乙個指向二維陣列的指標p,賦給它10個長度,把a陣列的值賦給(*p)[10]。

注意,這裡是a陣列是5行10列的,放入(*p)[10]是把a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5],a[0][6],a[0][7],a[0][8],a[0][9]放入(*p)[0]中,同理,將a[1][0...9]放入(*p)[1]。

最後(*p)[10]中的值只有五行被初始化為a陣列的值了。

在本例中,p和p[0]是同乙個意思,就是陣列a的起始位址,等價於cout

#include

#include "iostream"

using std::cout;

using std::endl;

using std::hex;

void main()

int a[5][10]=;

int (*p)[10]=a;

cout

0012feb8

0012feb8

#include

#include "iostream"

using std::cout;

using std::endl;

using std::hex;

void main()

int a[5][10]=;

int (*p)[10]=a;

cout<<*p

0012feb8

這是p和p[0]的區別就體現出來了。因為*p並不是取首元素的值,它這時才相當於p[0]。那如何通過p取得首元素的值呢,很顯然,應該再加乙個*操作符,如下:

cout<<**p<這時輸出結果自然就會和(*p)[0]一樣是1了。

擴充套件資料

設p是指向二維陣列a[m][n]的指標變數,則有:

int* p=a[0];//此時p是指向一維陣列的指標。p++後,p指向 a[0][1]。

如果定義int (*p1)[n];p1=a;p1++後,p1指向a[1][0];

則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:

p+i*n+j

相應的如果用p1來表示,則為*(p1+i)+j

元素a[i][j]相應的指標表示為:

*( p+i*n+j)

相應的如果用p1來表示,則為*(*(p1+i)+j)

同樣,a[i][j]也可使用指標下標法表示,如下:

p[i*n+j]

例如:int a[3][4]=,,};

則陣列a有3個元素,分別為a[0]、a[1]、a[2]。而每個元素都是乙個一維陣列,各包含4個元素,如a[1]的4個元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

若有:int *p=a[0];

則陣列a的元素a[1][2]對應的指標為:p+1*4+2

元素a[1][2]也就可以表示為:*( p+1*4+2)

用下標表示法,a[1][2]表示為:p[1*4+2]

15樓:匿名使用者

一、你的 float score 陣列定義的是:乙個3行、4列的二維浮點陣列,陣列的元素為浮點數。如果你換個格式書寫就清晰了!

float score[3][4]=,,};

在呼叫的過程中,score 就是這個陣列的首位址,指向的是浮點陣列。score + 1 指向的是陣列。

二、你的 float *p 定義的是:乙個指向浮點數的指標。這個是一維的。

在呼叫的過程中,float 指向的是 xx。乙個浮點數字。

兩個的定義不同,所以引數傳遞過程中會出錯。

三、你的 float (*p)[4] 定義的是:乙個指向含有四個元素的浮點陣列的指標。

在呼叫的過程中,float 指向的是,由四個浮點數組成的陣列。

這時兩個定義相同,所以引數傳遞過程中沒有錯誤。

四、有個建議,你的程式書寫格式不清晰,不利於你糾錯和修改,應該盡量的清晰、明確,不建議使用簡化方式定義引數。

作為乙個軟體工作者,應該盡量使程式流暢、格式清晰、易讀,這是乙個軟體工作者最基本的職業素養。

格式化後,程式如下,會清晰很多:

#include

void main()

,,};

search(score,2);

} void search(float (*p)[4],int n)/*這裡的 float *p 好像有問題*/

printf("\n");}

16樓:匿名使用者

p[0]指向陣列a的起始位址

p[9]野指標

c語言指向二維陣列指標問題

17樓:

#include

#define length 5

void main()

{ int i=0, j=0;

int iarray[length][length];

int (*parray)[length];

for (i=0; i

首先,如果是二維陣列,你定義的應該是乙個陣列指標,而不是指標陣列,二者的區別如下:

int *a[10]; 含有10個整型指標的陣列。

int (*a)[10]; 指向陣列大小為10的陣列指標。

如何讓指標指向二維陣列?

18樓:

指標指向二維陣列名(*p=a),用二維陣列的引用以一維的形式,比如要原陣列為三行四列,你要引用a[1][3]的值,可以用*(p+7)

c++指向多維陣列行的指標的問題

c語言中定義指向字元的指標陣列chars5則

void sort char s 這裡接收到的是抄指襲針陣列,即 陣列中各元素 是指標位址,s是陣列首位址 s i 表示第i 1個元素 的值 位址,乙個字串的首位址,s i 表示這個字串的第乙個元素,是個字元 s i是第i 1個元素的位址,s i 是位址中的資料,等同於s i c語言中char是什麼...

C語言指標陣列的問題

關注位址型別,只要型別匹配就正確,下面描述中注意括號,用來斷句。int a 2 3 陣列型別是int 2 3 位址型別是 int 3 含義是 指向 含3個整數的一維陣列 的常量指標,該指標指向的位址為3個列的一行,所以陣列名本身就是行位址。int p 3 陣列型別是 int 3 含義是 含3個 整數...

指標陣列指向的問題

temp str i 一句並不是指標變數指向乙個指標,而是指標傳遞 注意str的型別是 char 即乙個指標陣列 當然因為是作為函式形參,所以實際上是char二階指標 而str i 的型別是char 即乙個char指標 temp也是乙個char指標,所以temp str i 得意思是,使temp指向...