我有以下代码:
unsigned int a = 1;
unsigned int b = 2;
char *c = "Something";
unsigned int d = *(unsigned int *)(c + a + b);
我并不确切知道它的作用。
答案 0 :(得分:0)
向指针添加整数会使指针偏移其指向的结构的大小。
例如,让我们取一个char *指针,并假设在我的机器中char为8位。
char* a="HELLO!!!"
指向'H'的指针,现在当你向它添加'3'时,它现在指向'L'。
现在,在第二步中,将其转换为'unsigned int *'。假设我的系统上的'unsigned int'是32位,这就是'unsigned int *'指向32位长的东西。所以当你这样做时,
char* a="HELLO!!!";
a+=3; //a now points to 'L'
unsigned int* ptr=(unsigned int*)(a); // ptr now points to an integer which
//is 32 bits wide.
unsigned d=*ptr;
现在最后一步是分配'LLO!'的ASCII值(32位)存储到d。
答案 1 :(得分:0)
在C中,foo[i]
表示与*(foo+i)
相同。因此,在您的示例中,*(c + a + b)
表示c[a+b]
或c[3]
,即字母'e'。
因为你转换为指向unsigned int的指针,所以你得不到字母'e'。机器将读取符合unsigned int的字符数,并将它们放在机器正在使用的任何字节序中,以获得无符号的int值。
换句话说,你得到的东西没有定义,但如果你知道运行代码的机器的特性,那么它是可预测的。