70,029
社区成员




#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 1. 如果要把上面的数组,用指针的眼光来看待的话,那么a是一个二级指针,
// 那么*a是一个一级指针,*(*a)才是数组里面的int值
// 2. *a或者*(a + 0)就是一维数组{1, 2, 3, 4}的首地址,其中的2的地址就是在该一维数组的首地址上+1,即*(a + 0) + 1
// *(a + 1)就是一维数组{5, 6, 7, 8}的首地址,其中的8的地址就是在该一维数组的首地址上+3,即*(a + 1) + 3
// *(a + 2)就是一维数组{9, 10, 11, 12}的首地址,其中的11的地址就是在该一维数组的首地址上+2,即*(a + 2) + 2
cout << *(*(a + 0) + 1) << endl; // 输出2
cout << *(*(a + 1) + 3) << endl; // 输出8
cout << *(*(a + 2) + 2) << endl; // 输出11
// 事实上,你可以用1级指针来解决多级指针的问题,如下面代码:
int* b = *a;
cout << *(b + 1) << endl; // 输出2
cout << *(b + 1 * 4 + 3) << endl; // 输出8,其中的4就是第二维的长度
cout << *(b + 2 * sizeof(a[0])/sizeof(int) + 2) << endl; // 输出11,也可以用这种方式求出第二维的长度
return 0;
}
void main()
{
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int b=3;
int *n;
int *m;
int *p;
n=*(a+1);
m=*a+1;
p=*(a+1)+2;
}
10: n=*(a+1);(n指向5)
0040D7D6 8D 45 E0 lea eax,[ebp-20h]
0040D7D9 89 45 C8 mov dword ptr [ebp-38h],eax
11: m=*a+1;(m指向2)
0040D7DC 8D 4D D4 lea ecx,[ebp-2Ch]
0040D7DF 89 4D C4 mov dword ptr [ebp-3Ch],ecx
12: p=*(a+1)+2;(p指向7)
0040D7E2 8D 55 E8 lea edx,[ebp-18h]
0040D7E5 89 55 C0 mov dword ptr [ebp-40h],edx