C語言怎麼用指標代替二維陣列
文章推薦指數: 80 %
c語言怎麼用指標代替二維陣列,C語言怎麼用指標代替二維陣列,1樓匿名使用者1 設p是指向二維陣列a m n 的指標變數,則有int p a 0 此時p是指向一維陣列 ...
c語言怎麼用指標代替二維陣列,C語言怎麼用指標代替二維陣列
首頁>科技時間2021-05-0720: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_阿勒秋
設二維陣列為typenamea[m][n],則指向該陣列的指標為typename(*p)[n]=a;這樣就可以用p來代替二維陣列了。
3樓:汐_楓
#include
voidmain()
4樓:
看你具體的應用,提供幾個方法供參考:
1、一級指標
例:inta[m][n];
int*p=&a[0][0];
相當於將二維陣列當一維陣列用,需要自己根據n的大小計算下標,使用卻很靈活
2、指標陣列
例:inta[m][n];
int*p[m];
for(inti=0;i
例:inta[m][n];
int(*p)[n];
p=a;
用起來跟二維陣列沒區別,缺點在於n是固定的4、二級指標
例:inta[m][n];
int**p;
p=(int*)malloc(sizeof(int*)*m);
for(inti=0;i
5樓:匿名使用者
#include
#include
voidmain()
c語言指標的指標和二維陣列的區別?
6樓:文帝寶寶
指標的指標和二維陣列完全倆東西,二維陣列是一維陣列的一維陣列,元素是陣列,所以可以隱式轉化為int(*)[3],跟int**兩回事,擴充套件到更多維或其它型別也是成立的,只能隱式轉化為第一維的元素的指標
補充說明下隱式轉化為指標,簡單說就是這樣(t是任意型別)
設有一個陣列ta[10];
a的型別是“t[10]”,在做大多數運算的時候,都先隱式轉化為“t*”型別,即t的指標
對於多維陣列,可以看做是一個一維陣列,陣列的元素型別就是第二維開始的陣列型別,比如:
ta[10][20][30];
是一個有10個型別為“t[20][30]”元素的陣列,用**解釋更清晰:
typedeftu[20][30];
ua[10];
跟上面的定義等價,所以a只能隱式轉化為“u*”,“u*”後也就是“t(*)[20][30]”這個型別了,跟多級指標沒關係,因此,多維陣列不存在到多級指標的轉化規則,強轉只會導致問題
7樓:育知同創教育
二維陣列由若干個一維陣列組成在c語言中定義的二維陣列實際上是一個一維陣列,這個一維陣列的每一個成員又是一個一維陣列。
當變數作為函式的引數時,函式內修改的是形參,實參不變化;(swap(inta,intb))
當指標作為函式的引數時,函式內:若修改指標變數,實參指標指向變數不變。
若修改指標指向,實參指標指向的變數變化。
(swap(int*a,int*b))
c語言二維陣列用指標表示的問題
8樓:匿名使用者
#include
voidmain()
;int(*p)[4];
p=a;
printf("%d",*(p)[3]);
}首先你沒有理解int(*p)[4];
他的意思就是含有4個指標的陣列由於inta[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變數的地址)才能操作一個普通變數的地址,否則就是用“*”來操作普通變數,想一下
intx=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
for(i = 0; i
free(p);//釋放申請的記憶體。
return 0;
}用二維指標訪問二維陣列多用於函式呼叫。
對於一維陣列,如果函式引數為一維指標可以直接用陣列名當做函式引數。
但是如果函式引數為二維指標,直接用二維陣列名做引數會出現訪問出錯,是因為二維指標和二維陣列的訪問方式不同造成的,需要如示例**中做轉換。
另外一種常用的方法是利用二維陣列的記憶體連續性將二維陣列轉為一維陣列處理,與本題無關,不做更多描述。
其他用戶還看了:
向學長提個c語言問題(關於指標和函式)
小白髮問,這個C程式該怎麼編寫大佬請進
c語言一道題目求教教,C語言一道題目,求教教
c語言中如何通過二級指標來操作二維陣列
初學者求一道C語言的答案
為什麼我的codeblocks不能執行C程式
猜你喜歡
向學長提個c語言問題(關於指標和函式)
小白髮問,這個C程式該怎麼編寫大佬請進
c語言一道題目求教教,C語言一道題目,求教教
c語言中如何通過二級指標來操作二維陣列
初學者求一道C語言的答案
為什麼我的codeblocks不能執行C程式
推薦閱讀
向學長提個c語言問題(關於指標和函式)
小白髮問,這個C程式該怎麼編寫大佬請進
c語言一道題目求教教,C語言一道題目,求教教
c語言中如何通過二級指標來操作二維陣列
初學者求一道C語言的答案
為什麼我的codeblocks不能執行C程式
有整數a,b,c,由鍵盤輸入,輸出其中最大的數
延伸文章資訊
- 1陳煥宗教受程式設計1-指標.pdf
指標(pointer) 是C 語言裡面非常重要的用 ... 二維陣列 a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3...
- 2[C語言] - 指標及多維陣列 - Ivan's Blog
指標及一維陣列在不少的書籍,我們都可以看到可以把陣列看成指標,這不完全正確,但在實作上也不能說完全不正確本質上陣列名稱代表的是一個位址, ...
- 3[console] 二維陣列與指標@ 藍影
- 4C++ -傳遞二維陣列 - 小哈的程式工作坊
C++ -傳遞二維陣列(Pass 2D array as a function parameter in C++). 二維陣列到底怎麼傳進函式?指標?還要給數量?到底是ROW 的數量還是COLU...
- 5指標的指標
記憶體位址就單純是個值,若只是單純想儲存記憶體位址,使用void* 型態的指標就可以了。 ... 一維陣列變數的元素位址可以儲至 int* 指標,那二維陣列呢?在〈二維( ...