我最近在阅读有关C语言中的指针的信息,但停留在某个地方。我需要提供一个例子来使这个问题更加清楚。
我已经声明了两个整数变量a和b,并为其分配了值55和88。现在,通过使用&符号,我可以访问其地址并声明指针,如下所示:
#include <stdio.h>
int main(void)
{
int a = 55;
int b = 88;
int *pa = &a;
int *pb = &b;
printf("Address of 'a' is: %p\n", &a);
printf("Address of 'b' is: %p\n", &b);
printf("Desired new address for the value of 'b' is: %p\n", (pa+1));
//What to do here to assign the value of b into the address (pa+1) ?
}
我试图实现的目标(不使用任何数组)是:我希望将b的值分配给a旁边的地址。
我可以通过&a或* pa =&a获得a的地址,下一个地址为(pa + 1)。现在指针pa保存变量a的地址。因此,我猜(pa + 1)的值应该指向a的下一个可能地址的地址。
现在我的问题是拥有b的值和地址(pa + 1),我们如何将b的值注册/分配给地址(pa + 1)?
编辑:
以下操作无效:
int a = 55;
int b = 88;
int *pa = &a;
int *pb = &b;
printf("Address of 'a' is: %p\n", &a);
printf("Address of 'b' is: %p\n", &b);
printf("Desired new address for the value of 'b' is: %p\n", (pa+1));
*(pa + 1) = b;
printf("New address of 'b' is now: %p\n", &b);
输出:
要将值写入地址,请使用*address = value;
。
例如,
*(pa + 1) = b;
但是,这样做很可能会覆盖某些本应用于其他用途的内存,并使程序崩溃。
您有(pa+1)
,它是类型为int *
的地址,因此您要做的就是取消引用它:
*(pa+1) = b;
但是请注意,C标准不允许您在写操作超出对象的内存范围,并且实际上会调用undefined behavior。此类代码仅在尝试执行攻击(例如缓冲区溢出)时才有用。
编辑:
您的问题表明您想将b
的value写入其他地址,但是示例代码表明您实际上要更改变量b
的address,即完全是其他的东西。这是不可能的,因为变量的地址在生命周期中是固定的。
将b
的值写入您要使用的地址:
*(pa + 1) = b
但是请记住,这会导致不确定的行为,因此您可能无法获得想要的东西,无法确定。
这样,您将写入值,但b
的地址不会改变,这就是为什么在打印中看不到任何差异。