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
相关产品推荐
相关产品推荐

