2013年9月27日 星期五

C++ 陣列與指標

C++ 的陣列變數其實也是指標。

但有一點須要注意,
例如
int a[10];
int* p;
//以上 a 和 p 都是指標變數

// 但是
p = a; // 合法
a = p; // 不合法,因為 array 的指標 a,實際上是一個 constant 指標
結論:
int a[10]; 所代表的意義
  1. a 是 int * const 的形態,所以 a 是 const 的指標,因此 a 指到的記憶體位置,不能改變
  2. 在 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

沒有留言:

張貼留言