IE盒子

搜索
查看: 94|回复: 5

C/C++ 指向自己的指针

[复制链接]

2

主题

10

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2023-1-7 18:41:40 | 显示全部楼层 |阅读模式
起因是看到了这样的一个题目


主体就是这句话
void* p = &p;
首先呢,这句话有两个需要注意的地方。
第一是,任何指针都可以隐式的转换成void*的指针
int i = 114514;
double d = 1919.810;
void* p = &i;
p = &d;
如果是其它的指针类型,则需要强制类型转换。
int inum = 11514;
double* p = &inum;//编译错误
double* p = (double*)inum;//可以编译
第二则是,在定义的时候,变量就有地址了,所以可以取得到地址。
除了void*,其它的指针也可以这样操作。(不过需要加上强制类型转换
struct node {
    int x, y;
};
int* pi = (int*)π
double* pd = (double*)&pd;
node* pn = (node*)pd;
发现好像和正常的指针一样可以用。
int* p = (int*)&p;
*p = 12313;
cout << p << endl;
cout << &p << endl;
但是,你不能在使用*p 了。
我们这里简单的复习一下指针
原本的情况应该是这样的


指针有自己的地址,通知保存了一个地址。
当我们使用*p = 123 ,则会修改相应地址的内容。


但是,这里的“指向了自己的指针”是这个样子的。


你修改后,把自己修了。
*p = 123


接下来的*p 就会去123这个地址上。
for (int i = 1; i <= 100; i++) {
    long long* p = (long long*)&p;
    *p = i;
    cout << p << endl;
}
输出
0000000000000001
0000000000000002
0000000000000003
0000000000000004
0000000000000005
0000000000000006
0000000000000007
0000000000000008
0000000000000009
000000000000000A
000000000000000B
000000000000000C
......
这些地址,显然是不合法的。。。
回复

使用道具 举报

1

主题

6

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2023-1-7 18:41:58 | 显示全部楼层
老哥,这题目是哪儿的?
回复

使用道具 举报

3

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-1-7 18:42:33 | 显示全部楼层
cppquiz
回复

使用道具 举报

1

主题

11

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2023-1-7 18:43:28 | 显示全部楼层
所以应该是true是么
回复

使用道具 举报

2

主题

8

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2023-1-7 18:44:21 | 显示全部楼层
是true
回复

使用道具 举报

1

主题

14

帖子

22

积分

新手上路

Rank: 1

积分
22
发表于 2023-1-7 18:45:02 | 显示全部楼层
输出是 1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表