關於C語言指標的問題! |
尚未結案
|
kenken
一般會員 發表:12 回覆:28 積分:8 註冊:2003-05-15 發送簡訊給我 |
有誰可以幫我看一下錯誤!我找了很久,不知是那有問題也,有那位大大可以幫我?謝謝各位!!
錯誤有二個:
1: error C2664: 'pp' : cannot convert parameter 1 from 'int [2] [3]' to 'int *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 2: error C2110: cannot add two pointers #include
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
dear kenken,
你的問題在於指標使用方式錯誤, 我修正如下: void pp(int (*d)[3],int (*e)[3],int (*f)[3])
{
int i,j;
for (i=0;i<2;i )
{
for(j=0;j<3;j )
{
*(*(f i) j)=*(*(d i) j) *(*(e i) j);
}
}
} void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,j;
int a[2][3]={{2,2,6},{3,2,8}};
int b[2][3]={{5,2,2},{6,5,10}};
int c[2][3]={{0,0,0},{0,0,0}};
pp(a,b,c);
for(i=0;i<2;i )
{
for(j=0;j<3;j )
{
printf("%d",*(*(a i) j));
}
printf("\n");
}
printf("\n");
for(i=0;i<2;i )
{
for(j=0;j<3;j )
{
printf("%d",*(*(b i) j));
}
printf("\n");
}
printf("\n");
for(i=0;i<2;i )
{
for(j=0;j<3;j )
{
printf("%d",*(*(c i) j));
}
printf("\n");
}
printf("\n"); 不過重要的是, 你得暸解指標的用法, 說明如下:
int t1[2]; // t1 的指標型別是 int*
int t2[2][3]; // t2 is 的指標型別是 int (*)[3] 而 void pp(int *d[2][3],int *e[2][3],int *f[2][3]) 中,
int (*d)[3] 的指標型別是 int (*)[3]
int *d[2][3] 的指標型別是 int* (*)[3]
int (*d)[2][3] 的指標型別是 int (*)[2][3] 所以, 你可以看得出來 之間的差異, 得使用哪一個了
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
kenken
一般會員 發表:12 回覆:28 積分:8 註冊:2003-05-15 發送簡訊給我 |
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
kenken 你好,
互相討論幫忙就是k.top成立的主旨之一(站長, 我沒說錯吧
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
kenken
一般會員 發表:12 回覆:28 積分:8 註冊:2003-05-15 發送簡訊給我 |
|
kenken
一般會員 發表:12 回覆:28 積分:8 註冊:2003-05-15 發送簡訊給我 |
Royce520大大你好: 可不可以把要宣告的地方用陣列的方法寫,然後在function裡的寫法用指標來 寫!這樣是不是比較好控管自已的程式,對我這個新手來看!! #include
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
kenken 你好,
你是說的在 void pp(int [][3], int [][3], int [][3]);//就是這裡
是一種陣列寫法嗎? 不, 正確的理解是 它還是指標型別 ...
至於為什麼有這種宣告方式呢? 又跟 c/c++ 語言有關了, 型別檢查
(type checking) 對 c/c++ 是很重要的, 它提供了語意上的錯誤檢查
, 能幫助你找出可能導致錯誤的地方, 這也引出另一個問題 轉型
(casting), 說了這些是要跟你說 int [][3] 這個宣告, 是要告訴編譯器
這個指標指向一個 有三個 int 元素的陣列, 所以他還是個指標....
你也可以這樣寫,
void pp(int *, int *, int *); // 然後再函數內部再進行 index 轉換
甚至可以這樣寫,
void pp(void*, void*, void*); // 這裡還要多注意 把型別換回 int* 最後, 按照你原來 pp 想要的寫法, 應該是這樣的吧 void pp( int d[][3], int e[][3], int f[][3])
{
int i,j;
for(i=0;i < 2;i )
{
for(j=0;j < 3;j )
{
//*(*(f i) j)=*(*(d i) j) *(*(e i) j);
f[i][j] = d[i][j] e[i][j]; // 有沒有更直覺點呢
}
}
} 發表人 -
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
kenken
一般會員 發表:12 回覆:28 積分:8 註冊:2003-05-15 發送簡訊給我 |
引言: kenken 你好, 你是說的在 void pp(int [][3], int [][3], int [][3]);//就是這裡 是一種陣列寫法嗎? 不, 正確的理解是 它還是指標型別 ... 至於為什麼有這種宣告方式呢? 又跟 c/c 語言有關了, 型別檢查 (type checking) 對 c/c 是很重要的, 它提供了語意上的錯誤檢查 , 能幫助你找出可能導致錯誤的地方, 這也引出另一個問題 轉型 (casting), 說了這些是要跟你說 int [][3] 這個宣告, 是要告訴編譯器 這個指標指向一個 有三個 int 元素的陣列, 所以他還是個指標.... 你也可以這樣寫, void pp(int *, int *, int *); // 然後再函數內部再進行 index 轉換 甚至可以這樣寫, void pp(void*, void*, void*); // 這裡還要多注意 把型別換回 int* 最後, 按照你原來 pp 想要的寫法, 應該是這樣的吧 void pp( int d[][3], int e[][3], int f[][3]) { int i,j; for(i=0;i < 2;i ) { for(j=0;j < 3;j ) { //*(*(f i) j)=*(*(d i) j) *(*(e i) j); f[i][j] = d[i][j] e[i][j]; // 有沒有更直覺點呢 } } } 發表人 - >>< face="Verdana, Arial, Helvetica"> 我一直以為int * 才是指標,原來int [][3], int [][3], int [][3]),也是 指標哦,感謝Royce520大大!! 努力的向各位前輩們學習學習!! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |