这个程序:
#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的值不会改变。
为什么?
答案 0 :(得分:3)
当你这样做时
int x=ara[0];
你告诉编译器:
x
int
的新的自变量,并且ara[0]
。从那时起,x
和ara[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
,而ptr
为int *
.So x
和ara[0]
是存储在两个不同空格中的两个不同变量记忆中
执行x = ara[0]
会将x
的值更改为与ara[0]
相同,但更改此值不会影响另一个。