全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1019
推到 Plurk!
推到 Facebook!

關於C語言指標的問題!

尚未結案
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-22 22:33:51 IP:203.203.xxx.xxx 未訂閱
有誰可以幫我看一下錯誤!我找了很久,不知是那有問題也,有那位大大可以幫我?謝謝各位!! 錯誤有二個: 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  void pp(int *,int *,int *); void main() { 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"); } void pp(int *d[2][3],int *e[2][3],int *f[2][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); } } } 努力的向各位前輩們學習學習!! 發表人 - kenken 於 2003/05/22 22:36:54
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-22 23:09:21 IP:61.216.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-22 23:25:42 IP:203.203.xxx.xxx 未訂閱
哇,好厲害啊,感謝你,大大,每次都是你在回我,有點不好意思也!! 那麼我了解了! 我剛剛po的文章,是不是我宣告的指標型態不對,所以才會出錯! 還有就是Royce520大大,你覺的陣列和指標那個比較方便! 努力的向各位前輩們學習學習!!
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-23 00:15:46 IP:61.219.xxx.xxx 未訂閱
kenken 你好,   互相討論幫忙就是k.top成立的主旨之一(站長, 我沒說錯吧 ) 今天我將所知希望可以較正確的傳達給你 ...改天也有你可以教我 的地方, 所以沒什不好意思的 ... 加油! 現在回答你的問題. 是的, 的確是函數參數宣告有誤所造成, 用法 上一個 > 那麼指標呢? 是紀錄著某一個型別變數的位置(可以想像成門牌號碼) , 通常我們說它 指向那個變數, 如 > 還有, 你是不是還沒去看 > <><>*真實的事物最美, 簡單的道理最好, 我能體會的 太少* 發表人 - Royce520 於 2003/05/23 00:18:07
------
不要忘記呼吸,不要忘記編程! ∩__∩
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-23 00:20:16 IP:203.203.xxx.xxx 未訂閱
是的,Royce520大大,我受教了!!馬上去看! 努力的向各位前輩們學習學習!!
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-23 00:30:41 IP:203.203.xxx.xxx 未訂閱
Royce520大大你好:    可不可以把要宣告的地方用陣列的方法寫,然後在function裡的寫法用指標來    寫!這樣是不是比較好控管自已的程式,對我這個新手來看!!    #include  void pp(int [][3], int [][3], int [][3]); //就是這裡 void main() { 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}}; 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"); pp(a,b,c); for(i=0;i<2;i ) { for(j=0;j<3;j ) { printf("%d",*(*(c i) j)); } printf("\n"); } printf("\n"); } 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); } } } 努力的向各位前輩們學習學習!!
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-23 02:05:58 IP:61.219.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-23 18:49:05 IP:203.203.xxx.xxx 未訂閱
引言: 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大大!! 努力的向各位前輩們學習學習!!
系統時間:2024-05-15 17:51:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!