gpt4 book ai didi

c - 这些表达式做了什么 ii = (char *)&i ; aa= (char *)&a ;在下面的程序中?

转载 作者:太空狗 更新时间:2023-10-29 14:49:20 24 4
gpt4 key购买 nike

我试图理解指针的概念,但在程序的第 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,您不能分配 int *double * 值直接赋给 char * 对象。您必须使用转换表达式 来告诉编译器将值视为不同的类型:

ii = (char *) &i;

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

那么,你为什么要这样做?

除位域外,任何对象都可以映射到 charunsigned char 数组 - IOW,整数值 0x01234567 可以是被视为 char{0x01, 0x23, 0x45, 0x67} 的数组。您可以使用此属性执行一些有用的测试,或确定某些值的表示方式。例如,如果你想知道你的系统是大端还是小端,你可以取int0x00000001,把它当作一个数组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

请注意,将指针值转换为不同类型不一定安全 - 您可以通过这样做来启用一些真正令人讨厌的错误。

关于c - 这些表达式做了什么 ii = (char *)&i ; aa= (char *)&a ;在下面的程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58418980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com