我刚刚开始学习C,这很令人困惑。具体来说,指针使我感到困惑。我开始着手解决这个问题,但是我很困惑为什么这个特定的事情没有按照我的预期去做。
int num1 = 0, num2 = 1000;
int *pA = &num1, *pB = &num2;
pA = pB;
*pA = 42;
printf("%d\n", num1);
printf("%d\n", num2);
我知道,就我代码中的指针而言,“ *”访问存储在指针引用值处的值。对于以下代码,“ pA”链接到“ num1”。
在不使用'*'的情况下,我也知道'pA = pB'表示变量指针'pA'现在与'pB'具有相同的地址。这意味着'num1'的值为'1000'。然后,“ pA”指向的地址上的值将更改为“ 42”。除了它没有; 'num1'打印'0','num2'打印1000。
请有人可以解释出什么问题了吗
答案 0 :(得分:4)
在此行
pA = pB;
您将pA
(指针)的值设置为pB
的值。因此,它现在也指向num2
(pB
所指向的位置)。
因此,当您这样做时:
*pA = 42;
它将num2
设置为42。
除了没有; 'num1'打印'0','num2'打印1000。
答案 1 :(得分:0)
我也知道'pA = pB'表示变量指针 “ pA”现在与“ pB”具有相同的地址
你错了。 pA
和pB
是两个不同的变量,它们都有自己的地址。
例如,插入以下语句
printf( "&pA = %p, &pB = %p\n", ( void * )&pA, ( void * )&pB );
声明前后
pA = pB;
共同之处在于,变量现在具有与变量num2
的地址相同的值。因此,现在两个具有相同值的指针指向变量num2。使用这些指针中的任何一个,您都可以更改变量num2
的值。早先存储在变量num1
中的变量pA
的地址现在丢失了,因为指针pA的值在语句中被覆盖了
pA = pB;
答案 2 :(得分:0)
pA = pB; //this is assigning the location in memory that pB is pointing to to pA
因此pA不能再更改num1的值,因为它不再指向num1。现在它将更改pB指向的任何值。
答案 3 :(得分:0)
C中的变量是包含值的实际物理内存位置。这里有四个:num1,包含值0; num2,包含值1000; pA,其最初包含num1的内存地址; pB,其最初包含num2的内存地址。
在C中分配变量时,会将一个变量的内容复制到另一个变量。因此pA = pB
的意思是“将pB的值复制到pA中”。由于pB包含num2的内存地址,因此pA也包含num2的内存地址。 num1和num2的存储位置未更改-它们仍然包含0和1000。取消引用分配*pA = 42
表示“将值42移动到pA中包含的存储位置中”。由于pA包含num2的地址,因此num2现在为42(而num1仍为0)。