关于指针的一个简短的c++程序
A short C++ program about the pointer
#include <iostream>
using namespace std;
int main()
{
int x[][3]={1,2,3,4,5};
cout<<&x <<" "<<*x <<" "<<x <<endl;
cout<<&x[0]<<" "<<*x[0]<<" "<<x[0]<<endl;
cout<<&x[0][0]<<endl;
return 0;
}
结果是:
0x28fef8 0x28fef8 0x28fef8
0x28fef8 1 0x28fef8
0x28fef8
为什么x[0][0]
和x在同一个指针?什么是真正在0x28fef8?1还是0x28fef8?
像你这样的数组的数组在内存中是这样的
<>之前+---------+---------+---------+---------+---------+---------+| x [0] [0] | x [0] [1] | x [0] [2] | x [1] [0] | x [1] [1] | x [1] [2] |+---------+---------+---------+---------+---------+---------+之前 x
、x[0]
和x[0][0]
的位置相同。
同样,数组自然会衰变成指向其第一个元素的指针。如果您使用普通的x
,您将得到&x[0]
。如果你使用x[0]
,你会得到&x[0][0]
。因此,当您执行*x[0]
时,它与执行*&x[0][0]
时相同,并且解引用操作符和地址操作符相互抵消,因此您只剩下x[0][0]
,这是您要打印的值。
此外,为了帮助您理解为什么x
与&x[0]
相同,您需要知道对于任何数组或指针 x
和索引i
,表达式x[i]
与*(x + i)
相同。这意味着表达式&x[i]
与&*(x + i)
相同,并且由于寻址操作符和解引用操作符再次相互抵消,&x[i]
与(x + i)
相同(或者没有括号x + i
)。现在考虑i
为零的情况,那么我们有&x[0]
,它和x + 0
一样,和x
一样。所以&x[0]
和x
是一样的,反之亦然。
对于其他想知道&x
、&x[0]
和&x[0][0]
代表什么的人,请参阅:
虽然所有的x
, x[0]
, &x
, &x[0]
和&x[0][0]
可以表示相同的内存地址,但它们在语义上是不同的,即它们表示不同的类型:
-
x
是指向三个char
(或char (*)[3]
)数组的指针 -
x[0]
指向char
(或char *
) -
&x
是指向包含三个char
(或char (*)[3][3]
)的数组的指针。 -
&x[0]
是指向三个char
(或char (*)[3]
)数组的指针。 -
&x[0][0]
指向char
(或char *
)
当数组名满足sizeof()时返回数组的大小,当数组名满足&时返回指向该数组的指针,而不是数组名的地址。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 使用mongocxx驱动程序时包含头文件问题
- 如何在c++程序中找到函数的地址