#include <iostream> using namespace std; int main() { int a = 3; int * p = &a; cout << a << endl; // 3 cout << *p << endl; // 3 return 0; }
如上面這段程序所示,經過取地址符 &,指針 p 得到了變量 a 的地址,那麼解引用符 * 就能夠從 p 中獲得變量 a 的值。ios
也就是說,p=&a
和 *p=a
是等價的。p 是變量 a 的地址,從 p 中就能夠取出 a 的值。反之,能從 p 中取出 a 的值,p 也就是變量 a 的地址。數組
#include <iostream> using namespace std; int main() { // 一維數組的數組名就是數組的首地址 int data[3] = {1, 2, 3}; int *p1 = data; cout << p1[1] << endl; // 2 cout << *(p1+1) << endl; // 2 int *p2 = &data[0]; cout << p2[1] << endl; // 2 cout << *(p2+1) << endl; // 2 return 0; }
一維數組的數組名是數組的首地址,因此 int *p1 = data;
讓指針 p1 也指向了數組首地址。這時候 *p1 是數組的第一個元素,*(p1+1) 也便是數組的第二個元素。spa
又由於 *p1 是數組的第一個元素,說明 p1 是數組第一個元素的地址,因此 int *p2 = &data[0];
與上面等效。指針
#include <iostream> using namespace std; int main() { int data[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 行指針 //int (*p)[3] = &data[0]; int (*p)[3] = data; cout << p[1][2] << endl; // 6 cout << (*(p+1))[2] << endl; // 6 cout << *(p[1] + 2) << endl; // 6 cout << *(*(p+1)+2) << endl; // 6 return 0; }
data[3][3] 至關因而數組 data[data[0], data[1], data[2]],data[0], data[1], data[2] 都是有 3 個元素的一維數組,而 data 則是有 3 個這樣數組的一維數組。code
int (*p)[3] 表示行指針 p 指向一個有三個元素的數組,也就是指向外層數組的首地址,而 data
和 &data[0]
是等價的。第一次解引用獲得它指向的數組,第二次解引用才獲得數組中的值。io
#include <iostream> using namespace std; int main() { int data[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 列指針 //int *p = *data; //int *p = data[0]; int *p = &data[0][0]; cout << p[1 * 3 + 2] << endl; cout << *(p + 1 * 3 + 2) << endl; return 0; }
列指針是將二維數組展開成一維數組看待,因此列指針指向二維數組的第一個元素。&data[0][0]
、data[0]
、*data
三者都表明第一個元素的地址,訪問元素須要一次解引用,[]
和 *
等價。class
獲取更多精彩,請關注「seniusen」!stream