C 这些表达式做了什么;我aa=(字符*)&;A.在下面的程序中?

C 这些表达式做了什么;我aa=(字符*)&;A.在下面的程序中?,c,C,我试图理解指针的概念,我被程序中第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

我试图理解指针的概念,我被程序中第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;
}
#包括
int main()
{
int i=54;
浮点数a=3.14;
char*ii,*aa;//声明ii和aa为chaacter指针
ii=(字符*)&i;
aa=(字符*)&a;
printf(“ii=%u”中包含的地址,ii);
printf(“aa=%u”中包含的地址,aa);
printf(“ii中包含的地址的值为%d”,*ii);
printf(“aa=%d”中包含的地址的值,*aa);
返回0;
}

表达式
&i
生成类型为
int*
(指向
int
)的值,即
i
的地址。类似地,
&a
生成类型为
double*
(指针指向
double
)的值

除了
void*
类型之外,C不允许您将一种类型的指针值分配给另一种指针类型的对象-IOW,您不能将
int*
double*
值直接分配给
char*
对象。必须使用强制转换表达式来告诉编译器将该值视为不同的类型:

ii = (char *) &i;
表示“将
&i
的结果视为指向
char
的指针,并将结果分配给
ii
”。
(char*)
表达式是一个强制转换,它告诉编译器将以下表达式的值视为该类型

那么,你为什么要这么做

除位字段外,任何对象都可以映射到
char
无符号char
-IOW数组上,整数值
0x01234567
可以视为
char
{0x01、0x23、0x45、0x67}
数组。您可以使用此属性执行一些有用的测试,或确定某些值的表示方式。例如,如果您想知道您的系统是big-endian还是little-endian,可以取
int
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

请注意,将指针值强制转换到不同的类型并不一定是安全的——这样做可以启用一些真正讨厌的bug

这段代码无法编译。还有更多我们没有看到的吗?你知道/理解以下哪些内容:操作符的效果
&
,“cast”
(char*)
。需要这些信息来衡量您的知识水平并做出适当的回答。之所以进行强制转换,是因为变量与指针的数据类型不同。现在的问题需要一个指针教程,因此过于宽泛。请详细说明你想要解释的内容以及你已经知道的内容。那么问题就可以足够集中了。请学习。你到底不明白什么?