You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中int *p=10与int *p=(int *)10的区别及告警含义

C语言指针赋值相关问题解答

测试代码

你给出的测试代码如下:

#include <stdio.h>
int main()
{
    int *p = 10;
    int *q = (int *)10;

    return 0;
}

两个语句的核心区别

  • int *p = 10:直接将int类型的字面量10赋值给int*类型的指针变量,属于跨类型的隐式转换,不符合C语言的类型安全要求,编译器会主动抛出告警。
  • int *q = (int *)10:代码中加了(int *)强制类型转换,相当于程序员显式告知编译器,确认要将整数10转换为int类型指针后赋值给q,是符合语法规则的主动操作,编译器不会触发告警。

指针指向判断

两者最终效果一致,都是让指针变量存储的地址值为10,也就是指向内存中十进制为10的地址位置,区别仅在于地址赋值的转换方式是隐式还是显式。

告警含义说明

编译时输出的英文告警:

warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
翻译为中文:
警告:尝试用int类型值初始化int *类型指针,未做强制类型转换就直接将整数转为指针 [-Wint-conversion]

这个告警属于编译器的安全提示:整数直接转指针的操作大概率是代码编写错误(比如漏写了取地址符&,原本要指向某个存了10的int变量地址),如果你确实要把整数当内存地址使用,需要添加显式强制类型转换来明确你的操作意图,即可消除该告警。

内容的提问来源于stack exchange,提问作者mandy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:15:02