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

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

1樓:灩麗

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

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

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

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

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

2樓:小宇宙

倘若此時有一個二級指標

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

.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;

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

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

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

3樓:風若遠去何人留

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

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

#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語言用二級指標輸入輸出二維陣列,怎麼編寫?求賜教~

4樓:匿名使用者

#include

#include

#define n 10

void fun(int (*p)[n],int n,int m){int i,j;

for(i=0;i

基本這樣,將就就看吧,不明白再問

#include

#include

#define n 10

void fun(int **p,int n,int m){int i,j;

for(i=0;i

當然也可以直接這樣,直接用二級指標,不用陣列分配空間

c語言 初學 「使用二級指標輸入輸出一個二維陣列。」

5樓:匿名使用者

#include

int main()

printf("二維陣列如下:\n");

for(j=0;j

for(i=0;i

delete p[i];

delete p;

return 0;}

6樓:匿名使用者

int i,j,k;

printf("請輸入

行數和列數:");

scanf("%d%d",&n,&m);

int **p;

p= new int*[n];

for(i=0; i入數

組元素:");

for(j=0;j

c語言二級指標問題,C語言二級指標問題

1 通過二級指標去訪問二維陣列需要先給二級指標分配等同於二維陣列行數的一維陣列指標,然後把二維陣列的每行首地址賦值給對應位置的一維指標上。之後就可以通過二維指標直接訪問了。2 參考 如下,可以看具體註釋輔助理解。include 輸入輸出標頭檔案。include 本程式需要用到malloc free函...

二級C語言,下列程式的輸出結果,二級c語言題目 以下程式執行後的輸出結果是 main() int x 0210 printf X n ,x

九劍之上 main 語句2將 b和a分別傳給fun的兩個形參,b的地址傳遞給形參c,即c指向變數b,c c 1 即 c f 1,ascii碼值為g,故 c的值為g,注意,因為c變數的值是b的地址,c是對c的解引用,代表了b地址的內容,也即b變數的值,故b變數的值改變為g。fun函式第2句d 1即d ...

如何解決二級c語言素數問題

其實素數並不難,只是我感覺有點麻煩罷了,我做題常遇到這樣的問題一 判斷一個數是不是素數 二 判斷小於一個數的所有素數,並利用函式 呼叫 輸出三 輸入一個數,輸出比它大的n個素數。等等吧!第一個簡單 scanf d n int i,k 1 for i 2 i i a m j 有一點 2 也是素數,我也...