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

時間 2021-05-07 20:00:40

1樓:匿名使用者

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]

2樓:memo_阿勒秋

設二維陣列為typename a[m][n],則指向該陣列的指標為typename (*p)[n] = a;這樣就可以用p來代替二維陣列了。

3樓:汐_楓

#include

void main()

4樓:

看你具體的應用,提供幾個方法供參考:

1、一級指標

例:int a[m][n];

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

相當於將二維陣列當一維陣列用,需要自己根據n的大小計算下標,使用卻很靈活

2、指標陣列

例:int a[m][n];

int *p[m];

for(int i=0; i

例:int a[m][n];

int (*p)[n];

p = a;

用起來跟二維陣列沒區別,缺點在於n是固定的4、二級指標

例:int a[m][n];

int **p;

p = (int *)malloc(sizeof(int *)*m);

for(int i=0; i

5樓:匿名使用者

#include

#include

void main()

c 語言指標的指標和二維陣列的區別?

6樓:文帝寶寶

指標的指標和二維陣列完全倆東西,二維陣列是 一維陣列的一維陣列,元素是陣列,所以可以隱式轉化為int (*)[3],跟int **兩回事,擴充套件到更多維或其它型別也是成立的,只能隱式轉化為第一維的元素的指標

補充說明下隱式轉化為指標,簡單說就是這樣(t是任意型別)

設有一個陣列t a[10];

a的型別是「t [10]」,在做大多數運算的時候,都先隱式轉化為「t *」型別,即t的指標

對於多維陣列,可以看做是一個一維陣列,陣列的元素型別就是第二維開始的陣列型別,比如:

t a[10][20][30];

是一個有10個型別為「t [20][30]」元素的陣列,用**解釋更清晰:

typedef t u[20][30];

u a[10];

跟上面的定義等價,所以a只能隱式轉化為「u *」,「u *」後也就是「t (*)[20][30]」這個型別了,跟多級指標沒關係,因此,多維陣列不存在到多級指標的轉化規則,強轉只會導致問題

7樓:育知同創教育

二維陣列由若干個一維陣列組成在c語言中定義的二維陣列實際上是一個一維陣列,這個一維陣列的每一個成員又是一個一維陣列。

當變數作為函式的引數時,函式內修改的是形參,實參不變化;(swap(int a, int b))

當指標作為函式的引數時,函式內:若修改指標變數,實參指標指向變數不變。若修改指標指向,實參指標指向的變數變化。(swap(int *a, int *b))

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

8樓:匿名使用者

#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)

9樓:匿名使用者

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

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

就知道了。

10樓:匿名使用者

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

11樓:貴藹堂馨蓉

你說要放到另外一個陣列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;}

有問題歡迎**……

12樓:匿名使用者

#include

int main()

;int (*p)[4];

p=a;

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

return 0;

}//你沒有理

解多維陣列a的意思

c語言中如何通過二級指標來操作二維陣列

13樓:灩麗

1、首先我們開啟電腦裡的c語言軟體,新建一個工程和.c檔案,輸入標頭檔案和主函式。

2、然後我們輸入圖示**初始化陣列,定義變數型別。

3、然後我們輸入圖示**用for語句實現陣列的訪問。

4、然後我們輸入圖示**進行輸出。

5、然後我們輸入圖示**編譯、執行,即可通過二級指標來操作二維陣列。

14樓:小宇宙

倘若此時有一個二級指標

檔案中可以編譯通過,但會給出警告。若是在

.cpp檔案中則不會編譯通過!我相信很多人的第一反應是加上強制型別轉換:

q=(int**)a;

根據我上面講述的:q可視為int**型別,且是int*變數的地址型別變數!對q (指標變數)的引用,得到是的其(即q)記憶體單元的資料,即int*變數的地址,*q則是獲取q所指向的int*變數型別地址的內容,相當於int* q變數q的直接引用,得到是int型別變數的地址。

q所佔的記憶體為4byte,*q所佔的記憶體也為4byte

。一切都清楚了。

現在來分析二維陣列a的資料型別。我們知道指標與陣列的聯絡的常見具體應用有兩種:一種是「陣列指標」:形如(*ptr);另外一種是「指標陣列」:形如*ptr。

。來分析一下「陣列指標」(*ptr)[size],

ptr所指的物件是有size個某種資料型別值的陣列。而ptr本身又是一級指標,一級指標又等價於一維陣列。

a[2][3]的低維是一個維度為3的一維陣列。高維是一個維度為2的一維陣列,不難理解,正如前面所述:二維陣列的每個元素是一個一維陣列,相當於一維陣列的兩次巢狀。

比如變數a[0]是一個維度為3的一維陣列

,a[1]亦是一樣。這樣一來,高維的那一部分可視為一個指標!

一個膽大的設想出來了:二維陣列本質上就等同於「陣列指標」!

cout<

輸出結果為:int (*)[3](換行)int (*)[3]兩者完全相同,與設想一致!

現在回到問題上來,

q=(int**)a;

強制轉換成功,但卻不可能正確執行!

原因已浮出水面:q這個地址單元存放的是int*型別的「指標變數」的地址,而二維陣列a骨子裡卻是一個「陣列指標」。兩者完全是「八竿子打不著」!

想一想它們的記憶體分佈情況,前者(地址)所指向的記憶體大小恆為4byte

,後者(地址)所指向的記憶體大小是隨著你定義的陣列維數而不斷變化的!即使通過強制型別轉換成功,q的記憶體值就是a所代表的地址,但這個地址僅僅是一個地址,而q的記憶體值不僅要求是一個地址,而且還必須是一個「指標變數」的地址!只有這樣通過*q(前面說過:

*q則是獲取q所指向的int*變數型別地址的內容,即一個int變數的地址)才能操作一個普通變數的地址,否則就是用「*」來操作普通變數,想一下

int x=250;*x

又是「陣列指標」?這裡有必要強調一下:我是從它們的儲存映象上來講的,但編譯器的語義實現上兩者是絕不能劃等號的!

你能夠將一個二維陣列賦值給一個一維陣列嗎?顯然是不行的!因此我們這樣想:

語句q=(int**)a;

是將一個一維陣列(等價於一級指標)賦給一個二級指標(要通過「&」賦一級指標的地址才行)

,地球人都知道這是行不通的!雖然乍聽起來還蠻合理的,其實此般理解無異於穿鑿附會。剛才解釋過,兩者

的語義迥異!不過,這樣理解似乎更能深刻且方便地知道那樣做錯在**了,呵呵。

15樓:風若遠去何人留

通過二級指標去訪問二維陣列需要先給二級指標分配等同於二維陣列行數的一維陣列指標,然後把二維陣列的每行首地址賦值給對應位置的一維指標上。之後就可以通過二維指標直接訪問了。

參考**如下,可以看具體註釋輔助理解。

#include //輸入輸出標頭檔案。

#include //本程式需要用到malloc/free函式,引用該標頭檔案。

int main()

; //定義二維陣列a,並賦值從1-12.

int ** p = null;//定義二維指標。

int i, j;

p = (int **)malloc(sizeof(int *) *3);//要訪問的陣列有三行,所以申請三個一維指標變數。

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

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

free(p);//釋放申請的記憶體。

return 0;

}用二維指標訪問二維陣列多用於函式呼叫。

對於一維陣列,如果函式引數為一維指標可以直接用陣列名當做函式引數。但是如果函式引數為二維指標,直接用二維陣列名做引數會出現訪問出錯,是因為二維指標和二維陣列的訪問方式不同造成的,需要如示例**中做轉換。

另外一種常用的方法是利用二維陣列的記憶體連續性將二維陣列轉為一維陣列處理,與本題無關,不做更多描述。

c語言二維陣列問題

寫完以後我發現有點長,樓主給點耐心看,不懂我們再交流 a是整個二維陣列的首地址,short長度為2,sizeof a 2 5 5 50 a 1指向二維陣列的第二個元素,它僅僅是一個指標,如果在a 1前面加一個 號,就是第二個元素的值,即a 0 1 所以,a 1是一個指標,它指向二維陣列中的某個數,指...

C語言 用指標程式設計 輸入4 5的二維整型陣列,輸出其中最大值 最小值以及它們所在行和列的下標

it孤鶩 沒錯誤,你要效果是什麼 就那上面的例子 0 你想輸出 1行1列嗎 那隻要 後面四個變數加1 就可以了 printf 最大值為 d,行標 d,列標 d n max,xb1 h 1,xb1 l 1 printf 最小值為 d,行標 d,列標 d n min,xb0 h 1,xb0 l 1 你的...

c語言矩陣轉置運用二維陣列和指標

形參int a n 和int a n 在編譯時都被解釋為 a是指向長度為n的一維陣列的指標 所以函式體內的操作可以二者完全一樣。就是說如果你這個函式是正確的的話,把第一個形參改為int a n 其餘不變就是完全正確的。所以這沒有什麼新的意義,這裡就不費筆墨了。至於改為形參int a,那得稍費周折,因...