将地址转为4位16进制
string getHex(int x)
{
char buff[10];
sprintf_s(buff, "%X", (x & 0xFFFF));
return (string)buff;
}
数组a的元素地址
F318,F31C,F320,F324
F328,F32C,F330,F334
F338,F33C,F340,F344
int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
if (j)
{
cout << ",";
}
int* p = &a[i][j];
cout << getHex((int)p);
}
cout << endl;
}
指针数组
int* q[3] = { &a[0][0],&a[1][0], &a[2][0] };
指针数组是一个数组,其中的每个元素都是一个指针
q 是一个数组,包含 3 个元素。
每个元素是一个指向 int 类型的指针(int* )
数组指针
int(*p)[4];
p = a; //p = &a[0];
数组指针是一个指针,指向一个数组的首地址
p 是一个指向包含 4 个整数的数组的指针
也就是说,p 可以指向一个 int[4] 类型的数组
p 的值实际上是 a[0] 的地址
1. 指针+i
指针数组
F3C8
F3D0
F3D8
q是一个数组,q[0]是int*类型
q+i是q[i]的地址,也就是&(&a[i][0])
for (int i = 0; i < 3; i++)
{
string s = getHex((int)(q + i));
cout << "第" << i << "个q元素的地址是" << s << endl;
}
数组指针
F318
F328
F338
p是一个指针,指向a[0]数组
p+i是a[i]的地址,也就是&a[i][0]
for (int i = 0; i < 3; i++)
{
//p指向的是a[0]的地址
string s = getHex((int)(p + i));
//输出的是p的值,也就是a[0]的地址
cout << "第" << i << "个[4]数组的地址是" << s << endl;
}
2.*(指针+i)
指针数组
F318
F328
F338
q是一个数组,q+i对应的是q[i]的地址
*(q+i)是*q[i],即&a[i]
for (int i = 0; i < 3; i++)
{
string s = getHex((int)*(q + i));
cout << "a数组的第" << i << "行第0个元素的地址是" << s << endl;
}
数组指针
F318
F328
F338
p是一个指针,指向a[0]数组
p+i是a[i]的地址,也就是&a[i][0]
*(p+i)是*a[i],输出&a[i][0]
for (int i = 0; i < 3; i++)
{
string s = getHex((int)*(p + i));
cout << "a数组的第" << i << "行第0个元素的地址是" << s << endl;
}
3、*(指针+i)+j
指针数组
F31C
F32C
F33C
q是一个数组,q+i是q[i]的地址
*(q+i)是*q[i],即&a[i]
*(q + i)+j)是*(q[i]+j),即&a[i][j]
for (int i = 0; i < 3; i++)
{
string s = getHex((int)(*(q + i)+1));
cout << "a数组的第" << i << "行第0个元素的地址是" << s << endl;
}
数组指针
F31C
F32C
F33C
p是一个指针,指向a[0]数组
p+i是a[i]的地址,也就是&a[i][0]
*(p+i)是*a[i],输出&a[i][0]
*(p+i)+j是*(q[i]+j),即&a[i][j]
for (int i = 0; i < 3; i++)
{
string s = getHex((int)(*(p + i)+1));
cout << "a数组的第" << i << "行第0个元素的地址是" << s << endl;
}