Discussion:
指標和二維陣列...
(时间太久无法回复)
all pass!
2004-01-24 16:00:35 UTC
Permalink
c語言內, 如果用

int data[20][6];
int *p;
p=data;

是錯誤的...會何呢???
編譯器好像是提示: 一個二維陣列,不能和一個指標合用..

--

 ˍˍˍˍˍˍˍ
靈魂離子燙 - powered by KCW
▔▔▔▔▔▔▔
--
※ Origin: Yahoo!奇摩 大摩域 <telnet://bbs.kimo.com.tw> 
◆ From: 218-164-63-136.hinet-ip.hinet.net
老貢生
2004-01-25 04:51:57 UTC
Permalink
Post by all pass!
c語言內, 如果用
int data[20][6];
int *p;
請改成 (*p)[6];
這叫陣列指標。
Post by all pass!
p=data;
是錯誤的...會何呢???
編譯器好像是提示: 一個二維陣列,不能和一個指標合用..
Schwimmer
2004-01-25 05:32:40 UTC
Permalink
Post by 老貢生
Post by all pass!
c語言內, 如果用
int data[20][6];
int *p;
請改成 (*p)[6];
這叫陣列指標。
Post by all pass!
p=data;
是錯誤的...會何呢???
編譯器好像是提示: 一個二維陣列,不能和一個指標合用..
或者是改成int** p = NULL;
也是可以的....
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: 210-58-208-87.cm.apol.com.tw
2004-01-25 10:37:12 UTC
Permalink
Post by all pass!
c語言內, 如果用
int data[20][6];
int *p;
p=data;
是錯誤的...會何呢???
編譯器好像是提示: 一個二維陣列,不能和一個指標合用..
一維陣列的指標名稱本身型別是(type *),用來指向該陣列的起點,
二為陣列的指標名稱型別則是 (type **),它事實上是存放了 n 個 (type *) 的指標,
而這些存放 n 個指標的空間本身也是一個陣列,這個陣列的起點用一個 (type **) 的
指標指向起點,你所看到的二維陣列事實上就是這種東西。
--
※ Origin: 交大資工鳳凰城資訊站 <bbs.csie.nctu.edu.tw> 
◆ From: u96-11.u61-70.giga.net.tw
老貢生
2004-01-26 07:54:45 UTC
Permalink
Post by 汀
Post by all pass!
c語言內, 如果用
int data[20][6];
int *p;
p=data;
是錯誤的...會何呢???
編譯器好像是提示: 一個二維陣列,不能和一個指標合用..
一維陣列的指標名稱本身型別是(type *),用來指向該陣列的起點,
二為陣列的指標名稱型別則是 (type **),它事實上是存放了 n 個 (type *) 的指標,
抱歉,或許我 C 學的不好,但事實上二維陣列並不是
存放了 n 個 (type *) 的指標,而 (type **) 也和
data[n][n] 不是同型態的東西,也就是二維陣列的指標型別
不是 type ** ,而只能是 (type *)[n]。

在 C 語言中,一個指標必須有兩個功能:
1.指出變數位址
2.指出該變數長度。
所以 (type *)[n] 指明的長度是 type length * n
而 (type **) 指明的長度是指標變數的長度(long 的長度)
這兩個長度是不等的,所以編譯器會回應指標型態不同的錯誤。

所以 (type **) 叫做指標的指標,可以配合指標陣列使用,但
他無法作為多維陣列的指標,因為他本身無法取得正確的陣列長度。

以上是我讀 C 的體驗,其他 C++ 是否有另外的解釋,我完全外行。
在 C 語言中,指標陣列和陣列指標是兩碼事,指標更不等同於
陣列名稱,他們有部份可以相通,有部份不行。
Post by 汀
而這些存放 n 個指標的空間本身也是一個陣列,這個陣列的起點用一個 (type **) 的
指標指向起點,你所看到的二維陣列事實上就是這種東西。
all pass!
2004-01-26 04:44:31 UTC
Permalink
Post by 老貢生
Post by all pass!
c語言內, 如果用
int data[20][6];
int *p;
請改成 (*p)[6];
這叫陣列指標。
那問題是...如果以 (*p)[6] 這樣的寫法
等於得知道後面那個數字

若在條件不足下
想傳遞一個二維陣列 該如何寫呢??

如果說,有一個叫 int data[20][6]
想丟到一個叫 int tmp[][] 內...

該怎麼辦?
--

 ˍˍˍˍˍˍˍ
靈魂離子燙 - powered by KCW
▔▔▔▔▔▔▔
--
※ Origin: Yahoo!奇摩 大摩域 <telnet://bbs.kimo.com.tw> 
◆ From: 218-164-64-238.hinet-ip.hinet.net
老貢生
2004-01-26 08:26:49 UTC
Permalink
Post by all pass!
Post by 老貢生
Post by all pass!
c語言內, 如果用
int data[20][6];
int *p;
請改成 (*p)[6];
這叫陣列指標。
那問題是...如果以 (*p)[6] 這樣的寫法
等於得知道後面那個數字
若在條件不足下
想傳遞一個二維陣列 該如何寫呢??
如果說,有一個叫 int data[20][6]
想丟到一個叫 int tmp[][] 內...
該怎麼辦?
沒有辦法,因為指標必須知道他所指的變數資料長度到底多長,
才能做正確的位移。

譬如上列:
int (*p)[6];
當 p++ 時他的位址會移動 sizeof(int)*6
也就是 data[20][6] 這個變數的 data[1][0] 位址
但如果你把資料改成
data[20][3] 的話,那 (*p)[6] 就會移到 data[2][0] 的位置,
那資料就完全錯了,所以編譯器才會提出指標型態不符的警告。

至於前幾篇 post 提到的 int (**p) 的辦法還是型態不符,
因為如果你讓 p=data 取得位址,那 p++ 會跳到 data[0][1] ,
而不是 data[1][0],因為 int (**p) 叫指標的指標,他的長度
永遠與 long 長度相等,無法與你陣列長度配合的。

你會或許會問,那就沒個型態的指標會配合陣列變數自動調整位移大小嗎?
的確,據我的了解,C 裡面沒這種機制,其他語言就不清楚了。

請把握一個重點,在 C 語言中不管你的變數是幾維,只有第一維
能動態調整大小,其他維必須做明確宣告大小。

最後,如果你能夠了悟不管他幾維,不過是記憶體中一個連續資料區塊
而已,那麼你可以用個簡單的 int *p; 指標參照到任何一個變數的位址:

void data-in(int *ip,int x,int y)
{
int i,j;
for (i=0;i<x;x++)
{
for (j=0;j<y;j++)
{
*(p+j+(i*y))=i+j;
}
}
}

main()
{
int da[5][7];
int db[8][3];

data-in(&da[0][0],5,7);
data-in(&db[0][0],8,3);
}
all pass!
2004-01-26 04:46:54 UTC
Permalink
Post by Schwimmer
Post by 老貢生
Post by all pass!
c語言內, 如果用
int data[20][6];
int *p;
請改成 (*p)[6];
這叫陣列指標。
Post by all pass!
p=data;
是錯誤的...會何呢???
編譯器好像是提示: 一個二維陣列,不能和一個指標合用..
或者是改成int** p = NULL;
也是可以的....
如果是這樣, 那麼以
int data[20][6] 和 int **p

該如何配合使用呢?? 是 p=data 這樣嗎??
--

 ˍˍˍˍˍˍˍ
靈魂離子燙 - powered by KCW
▔▔▔▔▔▔▔
--
※ Origin: Yahoo!奇摩 大摩域 <telnet://bbs.kimo.com.tw> 
◆ From: 218-164-64-238.hinet-ip.hinet.net
2004-01-26 09:58:15 UTC
Permalink
Post by 老貢生
抱歉,或許我 C 學的不好,但事實上二維陣列並不是
存放了 n 個 (type *) 的指標,而 (type **) 也和
data[n][n] 不是同型態的東西,也就是二維陣列的指標型別
不是 type ** ,而只能是 (type *)[n]。
在 C 語言中,一個指標必須有兩個功能:
1.指出變數位址
2.指出該變數長度。
哦,抱歉,我太久沒有使用靜態配置的陣列了,疏忽了這點。
Post by 老貢生
所以 (type *)[n] 指明的長度是 type length * n
而 (type **) 指明的長度是指標變數的長度(long 的長度)
這兩個長度是不等的,所以編譯器會回應指標型態不同的錯誤。
所以 (type **) 叫做指標的指標,可以配合指標陣列使用,但
他無法作為多維陣列的指標,因為他本身無法取得正確的陣列長度。
以上是我讀 C 的體驗,其他 C++ 是否有另外的解釋,我完全外行。
您說的是對的,C++ 也是和 C 相同,差別只在於 C++ 不允許以 by
value 的方式傳遞陣列,共通點都是除了最左邊的那個維度外都必須
指定大小。
--
※ Origin: 交大資工鳳凰城資訊站 <bbs.csie.nctu.edu.tw> 
◆ From: u96-11.u61-70.giga.net.tw
2004-01-26 10:17:46 UTC
Permalink
Post by 老貢生
在 C 語言中,指標陣列和陣列指標是兩碼事,指標更不等同於
陣列名稱,他們有部份可以相通,有部份不行。
嗯,稍微補充一下,因為之前用 2d array 的時候,以下結果會印出 10:

int arr[3][5];

*(*(arr + 2) + 1) = 10;
printf("%d\n", arr[2][1]);

所以我一直是用 int ** 在處理動態配置的 2d array,忽略了 array 有
第一維度以後必須指定大小,且大小不同視為不同型別的特性。
--
※ Origin: 交大資工鳳凰城資訊站 <bbs.csie.nctu.edu.tw> 
◆ From: u96-11.u61-70.giga.net.tw

继续阅读narkive:
Loading...