首页 > 解决方案 > 这些表达式做了什么 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;
}

标签: c

解决方案


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

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

ii = (char *) &i;

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

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

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

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


推荐阅读