为什么此变量的值等于“ 0”而不是“ 42”?

时间:2019-10-10 14:32:29

标签: c pointers

我刚刚开始学习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。

请有人可以解释出什么问题了吗

4 个答案:

答案 0 :(得分:4)

在此行

pA = pB;

您将pA(指针)的值设置为pB的值。因此,它现在也指向num2pB所指向的位置)。

因此,当您这样做时:

*pA = 42;

它将num2设置为42。

  

除了没有; 'num1'打印'0','num2'打印1000。

Not when I try it.

答案 1 :(得分:0)

  

我也知道'pA = pB'表示变量指针   “ pA”现在与“ pB”具有相同的地址

你错了。 pApB是两个不同的变量,它们都有自己的地址。

例如,插入以下语句

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)。