首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >int *p=10和int *p = (int *)10有什么区别?

int *p=10和int *p = (int *)10有什么区别?
EN

Stack Overflow用户
提问于 2021-11-20 03:28:44
回答 3查看 130关注 0票数 3

这两个语句的含义是否与p指向地址位置10的含义相同?在编译时,第一次初始化会给出一些警告。这是什么意思?

代码语言:javascript
复制
#include <stdio.h>
int main()
{
    int *p = 10;
    int *q = (int *)10;

    return 0;
}

输出:

代码语言:javascript
复制
warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [- Wint-conversion]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-20 03:33:45

这两种情况都会将整数10转换为用于初始化int *的指针类型。第二种情况下的强制转换明确表明此行为是故意的。

虽然允许从整数转换为指针,但赋值运算符(以及扩展的初始化)并不明确允许这种转换,因此强制转换要求它是一致的。然而,许多编译器仍然允许这样做,并简单地发出警告(就像您显然所做的那样)。

但是,请注意,除非您在支持读取或写入特定内存地址的嵌入式系统上,否则实际尝试使用分配了特定数值的指针很可能会导致崩溃。

票数 8
EN

Stack Overflow用户

发布于 2021-11-20 03:42:17

int *p = 10;不正确(违反约束),编译器必须生成诊断消息。编译器可能会拒绝该程序,如果不拒绝,则不会定义任何行为。规则是指针的初始值必须是兼容的指针值或空指针常量。

int *q = (int *)10;表示将整数10转换为指针。结果是实现定义的,它可能是一个陷阱表示,这意味着如果执行到达此行,初始化会导致未定义的行为。

票数 3
EN

Stack Overflow用户

发布于 2021-11-20 03:36:56

int和指向整数int*的指针是不同的类型。第一行上的10是一个int,您试图将其赋给指向int类型的指针。因此出现了警告。(在X86上,两者共享相同的大小,但考虑到这一点主要是巧合)。

通过将int转换为指针,就像你在第二行所做的那样,你是在告诉编译器“嘿,我知道这是不同的类型,但我知道我在做什么,所以继续下去,把值10当作指针,因为我真的想指向地址为10的内存”。(在几乎所有情况下,10的内存地址都不会被您使用)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70043029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档