但有一點須要注意,
例如
int a[10]; int* p; //以上 a 和 p 都是指標變數 // 但是 p = a; // 合法 a = p; // 不合法,因為 array 的指標 a,實際上是一個 constant 指標結論:
int a[10]; 所代表的意義
- a 是 int * const 的形態,所以 a 是 const 的指標,因此 a 指到的記憶體位置,不能改變
- 在 compile 的時候,就分配(allocated)在記憶體裡
2維陣列與指標
有一個2維陣列,沒明確指定第2維元素索引時,可發現有以下關係
int nums[2][3] = {{10, 20, 30}, {40, 50, 60}}; // 指標 nums = nums[0] = &nums[0][0] printf("%p\n",nums); // 002FF798 printf("%p\n",nums[0]); // 002FF798 printf("%p\n",&nums[0][0]); // 002FF798 printf("%d\n",**nums); // 10 printf("%d\n",*nums[0]); // 10 printf("%d\n",nums[0][0]); // 10 // 指標 nums[1] = &nums[1][0] printf("%p\n",nums[1]); //002FF7A4 printf("%p\n",&nums[1][0]); //002FF7A4 printf("%d\n",*nums[1]); // 40 printf("%d\n",nums[1][0]); // 40
指標可做 +、- 、++、-- 運算 (input 和 output 都是記憶體位址,一次位移一個型態的大小)
指標可使用關係運算元( ==, !=, >, < 等),比較記憶體位址之間的關係
所以可以用加減,在陣列的元素位置間移動
int nums[2][3] = {{10, 20, 30}, {40, 50, 60}}; // nums[0]+1 = &nums[0][1] printf("%p\n",nums[0]+1); // 002FF79C printf("%p\n",&nums[0][1]); // 002FF79C printf("%d\n",*(nums[0]+1)); // 20 printf("%d\n",nums[0][1]); // 20 // nums[1]+2 = &nums[1][2] printf("%p\n",nums[1]+2); // 002FF7AC printf("%p\n",&nums[1][2]); // 002FF7AC printf("%d\n",*(nums[1]+2)); // 60 printf("%d\n",nums[1][2]); // 60
參考:
計算機概論與程式設計 Introduction to Computers and Programming
沒有留言:
張貼留言