指向未知位置的指针数组
Array of Pointers Pointing to an unknown location
我在练习指针数组。
我写了一个简单的代码。
#include<iostream>
using namespace std;
int main(){
int a[3]={1,2,3};
int *b[3];
for(int i=0; i<3; i++){
b[i] = &a[i];
}
cout<<b; //This gives a confusing output
cout<<endl;
for(int i=0; i<3; i++){
cout<<b[i];
cout<<endl;
}
}
和输出是
0x6ffe10
0x6ffe30
0x6ffe34
0x6ffe38
现在我不明白b指向哪里。
我知道这听起来很奇怪,但我想知道。
b指针指向的地方。
b[0]、b[1]、b[2] 给出预期结果。
b
是指向 int
的指针数组,它是堆栈上的局部变量。
它的地址不依赖于它的数组的各个元素被分配给什么。
如果在 for
循环之前打印它的值(在其中为其成员分配值),您将看到它与打印的值相同在 for
循环之后。
查看现场演示 here。
图示:
b 整个数组的内存地址。
当 b
传递给 cout
的 <<
运算符时,它会衰减为指针;因此就打印功能而言,打印出 b
与打印出 &b[0]
.
相同
因此,cout << b;
打印出b[3]
数组中第一个指针的地址。 (请注意,指针的地址 与指针指向的地址不是 相同的东西!这可能是混淆的根源 - 请记住指针变量也是一个变量,并且像任何其他变量一样,它在内存中有自己独特的位置,这与它指向的位置不同)
b
是指向 int
的 指针数组。它的地址是第一个指针的地址。
- 第一个指针
b[0]
被分配给 元素 a[0]
的 地址(所以 b[0]
指向 1
)。
b[1]
分配给 a[1]
的 地址(因此 b[1]
指向 2
)
b[2]
分配给 a[2]
的 地址(因此 b[2]
指向 3
)
在每种情况下,b
数组中的指针都保存着 a
中相应元素的地址。因此,如果在循环将 a
中的地址分配给 b
之后对 a
的元素进行了任何更改,则 [= 的元素指向的内存位置中保存的值10=] 会改变,但 b
持有的那个值的地址将保持不变。
我在练习指针数组。 我写了一个简单的代码。
#include<iostream>
using namespace std;
int main(){
int a[3]={1,2,3};
int *b[3];
for(int i=0; i<3; i++){
b[i] = &a[i];
}
cout<<b; //This gives a confusing output
cout<<endl;
for(int i=0; i<3; i++){
cout<<b[i];
cout<<endl;
}
}
和输出是
0x6ffe10
0x6ffe30
0x6ffe34
0x6ffe38
现在我不明白b指向哪里。 我知道这听起来很奇怪,但我想知道。 b指针指向的地方。 b[0]、b[1]、b[2] 给出预期结果。
b
是指向 int
的指针数组,它是堆栈上的局部变量。
它的地址不依赖于它的数组的各个元素被分配给什么。
如果在 for
循环之前打印它的值(在其中为其成员分配值),您将看到它与打印的值相同在 for
循环之后。
查看现场演示 here。
图示:
b 整个数组的内存地址。
当 b
传递给 cout
的 <<
运算符时,它会衰减为指针;因此就打印功能而言,打印出 b
与打印出 &b[0]
.
因此,cout << b;
打印出b[3]
数组中第一个指针的地址。 (请注意,指针的地址 与指针指向的地址不是 相同的东西!这可能是混淆的根源 - 请记住指针变量也是一个变量,并且像任何其他变量一样,它在内存中有自己独特的位置,这与它指向的位置不同)
b
是指向 int
的 指针数组。它的地址是第一个指针的地址。
- 第一个指针
b[0]
被分配给 元素a[0]
的 地址(所以b[0]
指向1
)。 b[1]
分配给a[1]
的 地址(因此b[1]
指向2
)b[2]
分配给a[2]
的 地址(因此b[2]
指向3
)
在每种情况下,b
数组中的指针都保存着 a
中相应元素的地址。因此,如果在循环将 a
中的地址分配给 b
之后对 a
的元素进行了任何更改,则 [= 的元素指向的内存位置中保存的值10=] 会改变,但 b
持有的那个值的地址将保持不变。