我有以下代码:指针aritmetic,添加字符指针到UINT
unsigned int a = 1;
unsigned int b = 2;
char *c = "Something";
unsigned int d = *(unsigned int *)(c + a + b);
而且我不知道到底它做什么。
我有以下代码:指针aritmetic,添加字符指针到UINT
unsigned int a = 1;
unsigned int b = 2;
char *c = "Something";
unsigned int d = *(unsigned int *)(c + a + b);
而且我不知道到底它做什么。
将一个整数添加到一个指针将指针偏移指针结构的大小。
例如,让我们拿一个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。
在C中,foo[i]
表示与*(foo+i)
相同。因此,在您的示例中,*(c + a + b)
表示c[a+b]
或c[3]
,它是字母'e'。
因为你投射到一个指向unsigned int的指针,所以你不会得到字母'e'。该机器将读取尽可能多的字符以适应unsigned int,并将它们放在您的机器正在使用的任何字节顺序中,以获取无符号的int值。
换句话说,你得到的东西没有定义,但是如果你知道代码运行的机器的特性,那么它就是可以预测的。