使用指针添加两个数字

时间:2015-04-17 18:31:37

标签: c pointers

我在互联网上找到了这个代码,用于使用指针添加两个数字。 无法理解它是如何工作的?任何帮助将不胜感激。

#include <stdio.h>
#include <conio.h>
int main()
{
      int  a,b,sum;
      char *p;
      printf("Enter 2 values : ");
      scanf("%d%d",&a,&b);
      p = (char *)a; // Using pointers
      sum = (int)&p[b];
      printf("sum = %d",sum);
      getch(); 
      return 0;
}

3 个答案:

答案 0 :(得分:5)

以下行将a中的值解释为地址:

p = (char *)a; 

&p[b]是从b开始的数组p元素的地址。因此,由于数组的每个元素的大小都是1,因此它是一个指向地址p+b的char指针。由于p包含a,因此它是p+a处的地址。

最后,以下行将指针转换回int:

 sum = (int)&p[b];    

但不用说:这是一个奇怪的结构。

补充说明:

请注意,根据C ++标准,存在一些限制:

  

5.2.10 / 5:可以将整数类型(...)的值显式转换为指针。

     

5.2.10 / 4 :指针可以显式转换为足以容纳它的任何整数类型。

因此,请更好地验证sizeof(int) >= sizeof(char*)

最后,虽然这种添加适用于大多数实现,但这并不是所有CPU架构上的保证行为,因为整数和指针之间的映射函数是实现定义的:

  

指针转换为足够大小的整数(如果有的话)   存在于实现上)并返回相同的指针类型   有其原始价值;指针和整数之间的映射是   否则实现定义。

答案 1 :(得分:2)

首先将a转换为具有相同值的指针。它并没有真正指向任何东西,它只是相同的价值。

表达式p[b]会将b添加到p并引用该位置的值。

然后取p[b]元素的地址并转换为整数。

答案 2 :(得分:2)

如评论所述,这是有效的,但可怕的代码 - 只是一个派对技巧。

p = (char *)a;

pa的值作为假定地址输入。

sum = (int)&p[b];

b数组的char元素的地址位于p + b

p == a(数字)以来,获得了正确的总和。

要获得一个有效的例子,请输入46和11。

p = (char *)a;            // p = 46
sum = (int)&p[b];         // the address of p[b] = 46 + 11 = 57

注意:*pp[b]无处写入或读取,大小无关紧要 - char数组除外,其中指针算术以1为单位