指出价值不会改变

时间:2014-07-30 12:54:37

标签: c arrays

这个程序:

#include <stdio.h>
int main()
{
    int ara[]={1,2,3};
    int *pr=ara;
    printf("*pr |%d|\n",*pr);
    ara[0]=2;
    printf("*pr |%d|\n",*pr);
    return 0;
} 

输出:

*pr |1|
*pr |2|

在上面的代码中,*pr的值在更改数组的第一个元素后从1更改为2

但是在这个例子中:

#include <stdio.h>
int main()
{
    int ara[]={1,2,3};
    int x=ara[0];//value of x is now 1
    ara[0]=2;
    printf("x=%d\n",x);//value of x still remains 1
    return 0;
}

x的值不会改变。

为什么?

6 个答案:

答案 0 :(得分:3)

当你这样做时

int x=ara[0];

你告诉编译器:

  • 您想要创建一个名为x int的新的自变量,并且
  • 必须从ara[0]
  • 复制该变量的初始值

从那时起,xara[0]之间没有关系:更改其中一个不会使另一个更改。

使用指针时,还会创建一个自变量,但这次变量会在内存中保留一些其他值的地址(除了保留指针的值)。当您谈论指针时,您可以区分两个值 - 指针的值和指针指向的值。在第一个示例中,ptr保留原始值,但它指向的值会更改。

答案 1 :(得分:2)

因为变量int x是内存中整数位置的符号。此位置与int ara[]的内存位置分开。

您应该使用指针x来指向数组的第一个元素位置;这将反映数组中的修改。在变量名之前使用asterix使其成为指针。这就是int *pr反映变化的原因。

Btw数组变量的名称(ara)是数组中第一个元素的地址;实际上是ara[0]的地址。行int *pr = ara使变量指向数组中的第一个元素内存位置。

答案 2 :(得分:2)

对于第一种情况

   int ara[]={1,2,3};
   int *pr=ara;

这里指针pr指向数组ara的第一个元素的地址。现在此地址的值为1(表示ara[0]=1)。现在,您通过ara[0]=2;在此地址指定不同的值。所以你会得到预期的输出。

第二种情况。

 int ara[]={1,2,3};
 int x=ara[0];

这里创建了x类型int的变量,并为ara[0]分配了x的值。所以这是基本的价值分配。 ara[0]x之间没有任何关联。更改值ara[0]变量x未修改后。

答案 3 :(得分:0)

所以错了,它仍然是一个,阅读代码中的注释以了解其工作原理

#include <stdio.h>
int main()
{
    int ara[]={1,2,3};
    int x=ara[0];     //**value of x is now 1 which it is taking from arr[0]**
    ara[0]=2;          // **value of arr[0] is being changed(but not x is modified here,it still holds the same value i.e 1)**
    printf("x=%d\n",x);//value of x still remains 1
    return 0;
}

它们都不同,并分配了不同的内存位置。

答案 4 :(得分:0)

在第一种情况下,您通过指针访问原始对象。在第二种情况下,您复制ara[0]并将其存储到x。由于它是副本,ara[0]的修改不会更改x

答案 5 :(得分:0)

x的类型为int,而ptrint * .So xara[0]是存储在两个不同空格中的两个不同变量记忆中 执行x = ara[0]会将x的值更改为与ara[0]相同,但更改此值不会影响另一个。