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

时间:2019-10-16 17:45:34

标签: 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 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;
}

1 个答案:

答案 0 :(得分:1)

表达式&i产生类型为int *(指向int的指针)的值,它是i的地址。同样,&a产生类型为double *的值(指向double的指针)。

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

ii = (char *) &i;

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

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

除位域外,任何对象都可以映射到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

请注意,将指针值强制转换为不同类型不一定是 safe -您可以通过执行此操作来启用一些真正令人讨厌的错误。