我在互联网上找到了这个代码,用于使用指针添加两个数字。 无法理解它是如何工作的?任何帮助将不胜感激。
#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;
}
答案 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;
p
将a
的值作为假定地址输入。
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
注意:*p
或p[b]
无处写入或读取,大小无关紧要 - char
数组除外,其中指针算术以1
为单位