我试图理解指针的概念,并且在程序的第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;
}
答案 0 :(得分:1)
表达式&i
产生类型为int *
(指向int
的指针)的值,它是i
的地址。同样,&a
产生类型为double *
的值(指向double
的指针)。
除了void *
类型,C不允许您将一种类型的指针值分配给另一种指针类型的对象-IOW,您不能分配int *
或将double *
的值直接添加到char *
对象。您必须使用 cast表达式来告诉编译器将该值视为另一种类型:
ii = (char *) &i;
表示“将&i
的结果作为指向char
的指针,并将结果分配给ii
”。 (char *)
表达式是 cast ,它告诉编译器将以下表达式的值视为该类型。
那么,为什么要这样做呢?
除位域外,任何对象都可以映射到char
或unsigned char
的数组上-IOW,整数值0x01234567
可以视为char
的数组值{0x01, 0x23, 0x45, 0x67}
。您可以使用此属性执行一些有用的测试,或确定如何表示某些值。例如,如果您想知道系统是大端还是小端,则可以采用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
请注意,将指针值强制转换为不同类型不一定是 safe -您可以通过执行此操作来启用一些真正令人讨厌的错误。