二維陣列與指標,二維陣列a的「列指標」與「行指標」有什麼聯絡

2021-12-25 03:29:26 字數 6006 閱讀 6501

1樓:伊旋圭蒙

int**m;可以分步驟來理解

**m意思是引用這個整型數,*m代表指向這個整型數的指標,m代表指向*m的指標,也就是傳說中指向指標的指標

一般情況下形參為指標型別時,可以傳送陣列名作為實參,也即陣列的起始地址,二維陣列的可以看成是多個一維陣列組成的

2樓:匿名使用者

用這種二維指標是不能操作這種二維陣列的,二維指標就是指標的指標,而這種情況應該用陣列指標,另外,由於二維自動陣列也是順序存放的,所以可以用一維指標傳遞二維陣列的地址,以下程式分別用陣列指標(fun()函式)和一維指標(fun2()函式)操作相同的操作:

#include

void fun(int (*p)[3]) /*或者void fun(int p[3])*/

void fun2(int *p,int col) /*p指向二維陣列首元素的地址,col是二維陣列的列數*/

int main(void)

;fun(a);

printf("%d\n",a[0][2]);

fun2(&a[0][0],3);

printf("%d",a[0][2]);

return 0;

3樓:匿名使用者

p = &a;現在你可以給她賦值了

二維陣列a的「列指標」與「行指標」有什麼聯絡

4樓:king離歌無言

1.行指標與列指標區別是否是+1上的不同,例如a[0]+1是指a[0][1]的地址

而&a[0]+1是指a[1][0]的地址!除了上面還有其他的行指標與列指標表示方法嗎?只要有其功能就可!

——本質上不存在任何區別,n維陣列的儲存空間都是連續的,只不靜態宣告陣列時,編譯器幫你生成了根據下表訪問特定元素的**,如a[3][3],使用a[1][2]則編譯器幫你生成*(a+(3*1)+2)的指標訪問**,所以對於二維陣列,設n,m分別為其

一、二維,行指標:a+(n*行數),列指標:a+列數,在該位置的元素:a+(n*行數)+列數,不過用這種思維來理解陣列欠妥,特別是維數多的時候。

2.**a,*a[0]是否別代表a[0][0]這個元素,是否就代表a可以當作指標,還是有其他的

區別!能講一點也好?

——不代表,a本身就是指標,而且是個值不能改變的指標,除非陣列的元素是指標或多階指標

3.正如上面所說,a,a[0],&a[0][0]是指同一個地址,除了上述+1區別,還有麼?(可以從用法或其他方面說)

——轉變思維方法,陣列是線性儲存,就線性地去理解它

4.陣列a[3][3],為何這個不可以for(i=0;i<9;i++)

scanf("%d",a++);

而 for(i=0;i<9;i++)

scanf("%d",a+i);可以呢?

區別在哪?

——a是個不能改變值得指標,所以a++肯定是錯的

5樓:

沒有所謂的列指標與行指標。只有列下標與行下標,一級指標、二級指標。其實,二維陣列在記憶體中也是順序存放的。

從首地址開始,計算偏移就能遍歷整個陣列。a[i][j]中,列下標與行下標可以方便表示偏移而已。

6樓:

沒有「列指標」這個說法,程式中為了便於理解才用行和列來表示二維陣列,實際上資料是按順序存放的,也就是說物理上根本沒有行列的概念。

c語言二維陣列用指標表示的問題

7樓:匿名使用者

#include

void main()

;int (*p)[4];

p=a;

printf("%d",*(p)[3]);

}首先你沒有理解int (*p)[4];

他的意思就是含有4個指標的陣列 由於int a[3][4]只有3行,所以*(p)[3]這個地方就越界了

如果*(p)[2]地址中的值就是17 *(p)[1] 就是9 ,*(p)[0]就是1

如果你要列印7 *((p)[0]+3)

8樓:匿名使用者

因為p[3]沒有指向a[0][3],你加條語言

printf("%x\t%x\n", p[3], &(a[0][3]));

就知道了。

9樓:匿名使用者

printf("%d",(*p)[3]);

10樓:貴藹堂馨蓉

你說要放到另外一個陣列b中,但是沒看到你定義新的陣列,所以我就按我自己的理解做了。

#include

#define

rows

3#define

cols

4double

copy_ptr(double

*tar);//一個變數就夠了

//rows和cols本來就是define的,全域性intmain(void),,

,};double

*p=source[0];

printf("taget[%d][%d]=",rows,cols);

copy_ptr(p);

printf("\n");

while(1)

{}return0;}

double

copy_ptr(double

*tar)

}//直接輸出了……

return0;}

有問題歡迎**……

11樓:匿名使用者

#include

int main()

;int (*p)[4];

p=a;

printf("%d",*(*p+2));

return 0;

}//你沒有理

解多維陣列a的意思

指向二維陣列的指標

12樓:小舅舅有點帥

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]

13樓:匿名使用者

一、你的 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");}

14樓:匿名使用者

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

p[9]野指標

c語言怎麼用指標代替二維陣列

15樓:匿名使用者

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

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

2.如果定義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 *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]

二維陣列的指標小問題

首先這是一個二為陣列,就不能簡單的把陣列名理解為元素地址了,這 時候陣列名代表 首行 地址,既第0 行 地址,行地址前再加個 才指向 元素 地址!行地址和元素地址 有些書也稱之為列地址,不過我覺的元素地址更好理解 的關係是,在程式中經常要經過行地址來表示元素地址,注意 最後都要變成元素地址才能用 元...

vb 二維陣列宣告問題,VB 二維陣列宣告問題

vb規定,dim 陣列必須要求常數表示式,否則會出錯。但此問題可以這樣解決 dim m1 as integer,m2 as integerdim a as integer dim b as integer dim c as integer m1 2 這裡可以改為m1,m2從資料庫中讀取的數值m2 2...

C二維陣列兩個二維陣列的乘積求助

陣列的長度從來都是指某一維度的長度,在哪個語言裡都是。你可以說二維版陣列第一 維度權的長度 第二維度的長度乘積是二維陣列的元素個數,但沒有 二維陣列的長度 這個概念。array 有 getlength int 這個方法,可以得到指定維度的長度。用c 編寫一個控制檯應用程式,求二維矩陣的乘積 void...