我在互联网上发现了这个代码,用于使用指针添加两个数字.无法理解它是如何工作的?任何帮助,将不胜感激.
#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;
}
Run Code Online (Sandbox Code Playgroud)
以下行将值解释a为地址:
p = (char *)a;
Run Code Online (Sandbox Code Playgroud)
&p[b]是从b数组开始的第th个元素的地址p.因此,由于数组的每个元素的大小都是1,因此它是一个指向地址的char指针p+b.如p 包含a,它是地址p+a.
最后,以下行将指针转换回int:
sum = (int)&p[b];
Run Code Online (Sandbox Code Playgroud)
但不用说:这是一个奇怪的结构.
请注意,根据C++标准,有一些限制:
5.2.10/5:整数类型(...)的值可以显式转换为指针.
5.2.10/4:指针可以显式转换为足以容纳它的任何整数类型.
所以更好地验证sizeof(int) >= sizeof(char*).
最后,虽然这种添加适用于大多数实现,但这并不是所有CPU架构上的保证行为,因为整数和指针之间的映射函数是实现定义的:
转换为足够大小的整数(如果实现上存在任何此类)并返回相同指针类型的指针将具有其原始值; 指针和整数之间的映射在其他方面是实现定义的.