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

時間 2021-08-30 09:32:14

1樓:麥香甜甜圈

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

#include

void main()

;int *p=a;

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

2樓:匿名使用者

二維陣列是指標的指標

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

3樓:未曾冷卻

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

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

所以int型的指標可以用

4樓:

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

比如 int a[3[4];

我們可以

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

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

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

5樓:影豐

可以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]

6樓:夢想窗外

給你一個參考例子,它們的關係可以從例子中看到。

#include

int main()

p1 = a;

for (i = 0; i < 3; ++i)putchar('\n');

return 0;}

c語言,c語言中指標陣列元素與一般麼指標變數有什麼區別?為什麼一般的指標不能指向二維陣列,而一個指

7樓:匿名使用者

c語言中指標陣列元素與一般麼指標變數沒有區別例如:int * a[10] ;

int * p;

int data=0;

則      a[0]=&data; p=&data;都是可以的為什麼一般的指標不能指向二維陣列,而一個指標陣列元素卻可以?我覺得你的這個問題問的有問題,應該是問:為什麼一般的指標不能指向二維陣列,而一個指向陣列的指標變數卻可以吧?

例如:int (* pa)[10][10] ;//定義一個指向整型二維陣列的指標

int * p;

int data[10][10];

則      pa=&data;//可以

而      p=&data;//不可以

8樓:我喜歡看火影

其實c語言中只有一維陣列並不存在二維陣列。

二維陣列就是幾個一維陣列湊在一起。

所以,一般的指標指向一維陣列。

指標陣列 指向二維陣列。

身份對等,共建和諧家園。

c語言,指向二維陣列的指標變數 100

9樓:兆嵐經新榮

int(*p)[4]這個就能當做二維陣列的指標,第二維的長度得是4。

傳遞一維陣列的時候,用的就是指向元素的指標,而不是指向陣列的指標inta[10];

void

f(int

*p);

f(a);

intb[10][10];

void

f2(int

(*p)[10]);

f2(b);

c語言中二維陣列名能否直接賦給指標變數

10樓:匿名使用者

二維陣列的指標與指標的指標是不一樣的。

所以int **ppr;

int fool[2][3];

ppr = fool;

這樣是不行的。

二維數回組的指標必須

答限定第一維的大小。

所以:int (*ppr)[3];

ppr = fool;

這樣才可以。

11樓:匿名使用者

可以,但所宣告的指標型別是指向指標的指標如:

int a[3][3];

int** array_ptr=a;

12樓:匿名使用者

可以,二維陣列名本身就是表示一個陣列的首地址。

13樓:手機使用者

可以,陣列名是陣列首元素的地址

14樓:孓圊

可以,例如a,*p=a

c語言中二維陣列名能否直接賦給指標變數

15樓:信耕順肖雀

二維陣列的指標與指標的指標是不一樣的。

所以int

**ppr;

intfool[2][3];

ppr=

fool;

這樣是不行的。

二維陣列的指標必須限定第一維的大小。

所以:int

(*ppr)[3];

ppr=

fool;

這樣才可以。

16樓:樂培勝樹雀

可以,二維陣列名本身就是表示一個陣列的首地址。

c語言二維陣列的地址為什麼 不可以賦值給指標變數?

17樓:自我程式設計

二維陣列抄的陣列名和襲

一維陣列的

陣列名不一樣。bai

一維陣列名dua表示其首地址zhi,指標型別是(int *)。

二維數dao組名d表示其行指標,指標型別是(int (*)[7])。

所以你要定義指標去用二維陣列名賦值,需要定義指標int (*k)[7];不是int *k。

或者你把二維陣列當成一維陣列來看(二維內部地址是連續的,和一維一樣),這樣int *k;k=&d[0][0];之後通過k++遍歷二維陣列所有值。

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

18樓:灩麗

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

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

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

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

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

19樓:小宇宙

倘若此時有一個二級指標

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

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

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

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

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

20樓:風若遠去何人留

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

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

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

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

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

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

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

伊旋圭蒙 int m 可以分步驟來理解 m意思是引用這個整型數,m代表指向這個整型數的指標,m代表指向 m的指標,也就是傳說中指向指標的指標 一般情況下形參為指標型別時,可以傳送陣列名作為實參,也即陣列的起始地址,二維陣列的可以看成是多個一維陣列組成的 用這種二維指標是不能操作這種二維陣列的,二維指...

指標二維陣列

用陣列指標來訪問 你有1個使用錯誤 訪問 ident num row num col 出界了應該 ident num row 1 num col 1 1個演算法錯誤 沒有根據行列值是否相等來判斷,相等才能賦值1.0而且每次迴圈p 有很多次 仔細看 會跳過很多元素,它們沒有賦值用i,j來定位行列很好做...

使用行指標和列指標輸出二維陣列元素

首先說明一下什麼是列指標。在c語言中,陣列是不同於普通變數的,實際上c定義的陣列是指向該陣列第一個元素的指標。這是第一個概念,即陣列名就是指標,所以可以直接當做指標來用,例如 對於一個陣列a,要取其第三個元素的值,既可以用a 2 也可以用a 2來訪問。對於一個二維陣列,如果用下標變數來表示的話,則可...