c - 这些表达式做了什么 ii = (char *)&i ; aa= (char *)&a ; 在下面的程序中?
问题描述
我试图理解指针的概念,我被困在程序第 6 行和第 7 行的这个符号上。提前帮助我理解指针的这个概念。
我开始学习 c 中指针的基本知识,我被这个表达式所困扰
ii = (char *)&i;
aa= (char *)&a;
完整代码:
#include<stdio.h>
int main()
{
int i = 54;
float a = 3.14;
char *ii , *aa; //declaring ii and aa as chaacter pointer
ii = (char *)&i;
aa= (char *)&a;
printf("adress contained in ii = %u",ii);
printf("adress contained in aa = %u",aa);
printf("value at the adress contained in ii is %d " , *ii);
printf("value at the adress contained in aa = %d ", *aa);
return 0;
}
解决方案
该表达式&i
产生一个类型的值int *
(指向 的指针int
),即 的地址i
。类似地,&a
产生一个类型的值double *
(指向 的指针double
)。
除了void *
类型之外,C 不允许您将一种类型的指针值分配给不同指针类型的对象 - IOW,您不能直接将 aint *
或double *
值分配给char *
对象。您必须使用强制转换表达式来告诉编译器将该值视为不同的类型:
ii = (char *) &i;
意思是“将结果&i
视为指针char
并将结果分配给ii
”。该(char *)
表达式是一个cast,它告诉编译器将以下表达式的值视为该类型。
那么,你为什么要这样做呢?
除位域外,任何对象都可以映射到char
或unsigned char
- IOW 的数组上,整数值0x01234567
可以被视为char
值的数组{0x01, 0x23, 0x45, 0x67}
。您可以使用此属性执行一些有用的测试,或确定某些值的表示方式。例如,如果您想知道您的系统是 big-endian 还是 little-endian,您可以获取int
value 0x00000001
,将其视为 的数组char
,然后测试第 0 个和最后一个元素:
int val = 0x00000001; // assumes 32-bit integers!
char *varr = (char *) &val; // pretends val is an array of char
if ( varr[0] == 0x01 )
// little endian
else if ( varr[ sizeof val - 1 ] == 0x01 )
// big endian
else
// something else
请注意,将指针值转换为不同的类型不一定安全- 您可以通过这样做来启用一些真正令人讨厌的错误。
推荐阅读
- javascript - 如何使用 javascript jQuery 在文本之间添加空格
- robotframework - 如何在机器人框架中声明密钥
- android - 在 Swift VS Kotlin 中分裂
- c# - 如何在 Discord.NET 库上获取自定义用户状态
- github-actions - GitHub Action 可以知道它在 @ 字符之后指定的版本吗?
- c++ - CreateWindow 预期表达式和语法错误
- python - 更改 django 默认 modeladmin 面包屑
- java - 在具有 Windows zulu8 的同一台机器上使用 SimpleDateFormat 使用相同语言环境的不同结果
- c# - asp.net 构建成功但发布失败并出现 System.OutOfMemoryException 错误
- .net-core - MMALSharp 单摄像头双预览带叠加