gpt4 book ai didi

c++ - 为什么我们需要为指针放置 *

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:49:40 28 4
gpt4 key购买 nike

我在阅读有关指针的内容时突然想到,如果指针只是一个存储变量内存地址的变量,那么每个整数都应该用作指针。然后我创建了一个小程序,它发出警告但不知何故起作用了。

int main()
{
int i,j;
i=3;
j=&i;
printf("%d\n%d\n%d",i,j,&i);
return 0;
}

输出是

3
1606416600
1606416600

那么,如果正常的 int 就可以工作,为什么还要放一个额外的 * 呢?

另一个问题是关于下面程序的输出

int main()
{
int a[] = {1,2,3,4,5,6,7};
int *i,*j;
i=&a[1];
j=&a[5];
printf("%d\n%d\n%d",j,i,j-i);
return 0;
}

输出:

1606416580
1606416564
4

为什么 j-i = 4 而不是 16?

最佳答案

Why do we need to put * for pointer

因为语言规范是这么说的。

So, why to put an extra * if normal int does the work?

因为“正常”int 不做这项工作。 “异常”int 也不会。

指针是一种独立的类型。难怪人脑可以轻松地将它们想象成称为“内存”的 huuuuuge 字节数组的索引,但这不一定是计算机和编译器所做的。 C 标准规定指针和 int 之间的转换是实现定义的操作。

如果您使用内置类型 intptr_tuintptr_t,您可以存储一个指针而不会丢失数据——但两者都不是其中的保证是 int(或 unsigned int,就此而言)。


关于你的第二个问题:因为这就是指针算法的定义方式。它是这样定义的,因为它是合乎逻辑和直观的。如果 p2 = p1 + 4,则 p2 - p1 是 4 而不是 16。

See this question有关指针算法的更多信息。


哦,从技术上讲,您的第一个程序有未定义的行为,因为打印指针是使用 %p 转换说明符完成的,但您使用了 %d 用于 int。你的第一个程序应该是这样的:

printf("%d\n%d\n%p", i, j, (void *)&i);

(另请注意转换为 void * - 这是为数不多的需要转换为 void * 的情况之一,否则你又得到了 UB。)

关于c++ - 为什么我们需要为指针放置 *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18942324/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com