19

我有这段代码可以解决问题:

#include <stdio.h>
int main()
{
    int a = 30000, b = 20,sum;
    char *p;
    p=(char *)a;
    sum = (int)&p[b]; // adding a & b
    printf("%d",sum);
    return 0;
}

有人可以解释一下代码中发生了什么吗?

p = (char*)a;
sum = (int)&p[b]; // adding a & b
4

4 回答 4

37

&p[b]基本上是糖:

&*(p + b)

*和运算符在&这里是逆运算和取消,简单地离开p + b。强制转换只是规避了 C 的类型检查。char *然而,使用指针这一事实重要。C 缩放指针算术,sizeof(char) == 1根据定义,缩放因子为 1。

于 2012-06-28T12:25:03.397 回答
23

我认为值得在其他答案中添加对 c 中指针、数组和内存位置的快速解释。

首先,c 中的数组只是一块足以容纳数组中项目数的内存块(请参阅http://www.cplusplus.com/doc/tutorial/arrays/

所以如果我们说

int[5] example;
example[0] = 1;
example[1] = 2;
example[2] = 3;
example[3] = 4;
example[4] = 5;

假设 int 是 32 位,我们将有一个 5*32 位 = 160 位长的内存块。由于 C 是一种低级语言,它试图尽可能高效,因此尽可能少地存储有关数组的信息,在这种情况下,尽可能少的信息是第一个元素的内存地址。所以例子的类型可以表示为

int *example;

或者 example 指向一个 int。要获取数组中的项目,然后将正确的数字添加到示例中存储的地址并读取该内存地址处的数字。如果我们假设内存看起来像

Memory Address = Value (ints take up 4 bytes of space)
          1000 = 1          <-- example
          1004 = 2   
          1008 = 3   
          1012 = 4   
          1016 = 5

所以

int i = example[3];  //The 4th element

可以表示为

int i = *(example + 3 * sizeof(int));
int i = *(example + 3 * 4);
int i = *(1000 + 12);
int i = *(1012); // Fetch the value at memory location 1012
int i = 4;

sizeof(int) 为 4(int 为 32 位,或 4 * 8 位字节)。如果您尝试添加,则需要一个 8 位或 1 * 8 位字节的字符。

所以回到你的代码

char* p;       // declare p as a pointer to a char/
p = (char *)a; // point p at memory location 3000
// p[b] would be the 21st element of the "array" p =>
// p[20]  =>
// p + 20 * sizeof(char) =>
// p + 20 * 1 =>
// p + 20  =>
// 3000 + 20 =>
// 3020
// the & operator in c gets the address of the variable so
sum = (int) &p[b]; 
// &p[b] => find the address pointed to by p[b] => 3020
// (int) casts this pointer to a int.

所以 sum 被分配了数组第 21 个元素的地址。

冗长的解释。

于 2012-06-28T13:10:36.853 回答
6

p[b] 返回数组 p 的第 b 个元素,相当于 *(p + b)。&p[b] 等于转换回 int 的 p + b*sizeof(char)。

于 2012-06-28T12:24:55.070 回答
0

如果问题是“在没有 + 运算符的情况下添加两个数字”,这里是一个:

#include <stdio.h>

int main()
{
int a=5, b=7;
int a1=a, b1=b;
int res;

res = (++a1 * ++b1) - (a * b) -1;

printf("a1=%d b1=%d res=%d\n", a1, b1, res );
return 0;
}
于 2012-06-28T14:00:26.727 回答