C 指向的值不变

C 指向的值不变,c,arrays,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更改为2 但在这个例子中: #include <stdio.h> int main(

该计划:

#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
更改为
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;
}
#包括
int main()
{
int ara[]={1,2,3};
int x=ara[0];//x的值现在是1
ara[0]=2;
printf(“x=%d\n”,x);//x的值仍然为1
返回0;
}
x的值没有改变


为什么?

那么,有什么问题,它仍然是一个,请阅读代码中的注释,了解它是如何工作的

#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;
}
#包括
int main()
{
int ara[]={1,2,3};
int x=ara[0];//**x的值现在是1,它从arr[0]中获取**
ara[0]=2;//**正在更改arr[0]的值(但此处没有修改x,它仍然保持相同的值,即1)**
printf(“x=%d\n”,x);//x的值仍然为1
返回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;
}
#包括
int main()
{
int ara[]={1,2,3};
int x=ara[0];//**x的值现在是1,它从arr[0]中获取**
ara[0]=2;//**正在更改arr[0]的值(但此处没有修改x,它仍然保持相同的值,即1)**
printf(“x=%d\n”,x);//x的值仍然为1
返回0;
}

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

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

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

int x=ara[0];
您可以告诉编译器:

  • 您想创建一个新的独立变量,名为
    x
    ,类型为
    int
    ,并且
  • 该变量的初始值必须从
    ara[0]
    复制
从那时起,
x
ara[0]
之间就没有关系了:改变其中一个不会改变另一个

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

执行此操作时

int x=ara[0];
您可以告诉编译器:

  • 您想创建一个新的独立变量,名为
    x
    ,类型为
    int
    ,并且
  • 该变量的初始值必须从
    ara[0]
    复制
从那时起,
x
ara[0]
之间就没有关系了:改变其中一个不会改变另一个


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

x
类型为
int
,而
ptr
类型为
int*
。因此
x
ara[0]
是存储在内存中两个不同空间中的两个不同变量
执行
x=ara[0]
x
的值更改为与
ara[0]
相同,但更改此值不会影响其他值。

x
类型为
int
,而
ptr
类型为
int*
。因此
x
ara[0]
是存储在内存中两个不同空间中的两个不同变量
执行
x=ara[0]
x
的值更改为与
ara[0]
相同,但更改此值不会影响另一个。

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

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


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

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

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

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

对于第一种情况

   int ara[]={1,2,3};
   int *pr=ara;
这里的指针
pr
指向数组
ara的第一个元素的地址<