你原本的 code 用
gcc -Wall 編譯時
test.c: In function 'main':
test.c:8: warning: assignment from incompatible pointer type
這個警告你沒有看過嗎?
你把 ptr 宣告成
int (*ptr)[3];
就不會有這個警告了
指標和陣列是不同的東西, 一言難盡,
板上高手眾多, 在此就不獻醜了.
※ 引述《yguma410 (malo)》之銘言:
: 不好意思~~
: 我想我沒表表達清楚
: 我指的是我用下面這一行沒問題,因為這是我自算要shift多少個int的長度
: printf("array[%d][%d]=%d\n", i, j, *(ptr+(i*3+j)));
: 但是當我用改為這樣時,就會出錯(我用code:blocks會程式當掉)
: printf("array[%d][%d]=%d\n", i, j, *(*(ptr+i)+j));
: 但若用原來的陣列的指標來寫,就沒有問題
: printf("array[%d][%d]=%d\n", i, j, *(*(array+i)+j));
: 我想問的是ptr和array不都是二維的指標嗎?
: 為何array就知道第一次array+i要shift 3個int
: 而ptr就不知道?且當掉
: ※ 引述《yguma410 (malo)》之銘言:
: : 問題:
: : 程式如下,我的問題是:用array去寫成 *(*(array+i)+j) 就沒問題
: : 這表示說c語言的陣列是有記住他是3x3的陣列
: : 不然他怎麼知道第一層的array+i他要跳 3*sizeof(int) 呢?
: : 這樣是不是表示array除了用了 [3][3]的記憶體外,還有用到其它的?
: : 有哪位高手可解解疑問嗎
: : 謝謝
: : 程式:
: : void pointer_test2()
: : {
: : int array[3][3]=
: : {{1, 2, 3},
: : {4, 5, 6},
: : {7, 8, 9}};
: : int **ptr;
: : int i, j;
: : ptr = array;
: : for(i=0; i<3; i++)
: : for(j=0; j<3; j++)
: : printf("array[%d][%d]=%d\n", i, j, *(ptr+(i*3+j)));
: : //下面這一行是不行的,因為ptr不是陣列,所以程式不知道一列有幾個元素
: : //printf("array[%d][%d]=%d\n", i, j, *(*(ptr+i)+j));
: : }
: : int main()
: : {
: : pointer_test2();
: : return 0;
: : }
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.44.19.112