tttttt@@@@@@ 发表于 2023-6-8 10:27:23

指针与数组

在指针与数组中对于*p=a是不是不可以是不是只有*p=&a或者p=a可以

isdkz 发表于 2023-6-8 10:27:24

在C和C++语言中,数组名代表的是数组的首地址。比如你有一个数组int a; ,那么a就表示这个数组的首地址。也就是说,数组的名字是一个指向数组首元素的指针。

如果你有一个指针int *p; ,你可以将数组的地址赋给它: p = a; 。这将使p指向数组a的第一个元素。之后,你可以用*p来访问或者修改数组的第一个元素。

因此*p = a;和p = &a;是不同的。前者是将数组的第一个元素的值赋给指针所指的位置,而后者是将数组的首地址(也就是第一个元素的地址)赋给指针。

如果p已经指向了某个内存位置,那么*p = a;是正确的,它将数组a的第一个元素的值赋给了p所指的位置。如果p还未初始化(即未指向任何内存位置),这条语句将导致未定义的行为,可能会导致程序崩溃。

而p = &a;和p = a;是等价的,都是将数组的首地址赋给了指针p 。注意,这并不会改变p所指位置的值,而是改变p所指向的位置。

tttttt@@@@@@ 发表于 2023-6-8 15:13:54

isdkz 发表于 2023-6-8 10:53
在C和C++语言中,数组名代表的是数组的首地址。比如你有一个数组int a; ,那么a就表示这个数组的 ...

那在这三种情况下改变*p或者p对a的值都会有影响吗

isdkz 发表于 2023-6-8 15:17:04

tttttt@@@@@@ 发表于 2023-6-8 15:13
那在这三种情况下改变*p或者p对a的值都会有影响吗

在C和C++中,如果你改变指针 p 所指向的位置,对应的位置的值将被改变。这就意味着如果 p 指向数组 a 的一个元素,改变 *p 的值就会改变数组 a 中相应的元素。比如,如果你执行了 p = &a; *p = 20; ,那么数组 a 的第三个元素将被改为20。

但是,如果你改变的是 p 的值,也就是让 p 指向另一个位置,那么原来 p 所指向的位置的值不会改变,这个改变只会影响到 p 自己。比如,如果你执行了 p = &a; p = &a; ,那么 p 现在指向数组 a 的第四个元素,但是数组 a 的第三个元素不会受到影响。

总结一下, *p 是指针 p 所指向的位置的值,改变 *p 的值会影响到这个位置的值。 p 是指针本身,改变 p 的值(让 p 指向另一个位置)只会影响到 p 自己,不会影响到原来 p 所指向的位置的值。

tttttt@@@@@@ 发表于 2023-6-8 16:55:32

isdkz 发表于 2023-6-8 15:17
在C和C++中,如果你改变指针 p 所指向的位置,对应的位置的值将被改变。这就意味着如果 p 指向数组 a 的 ...

对于*p = a改变了p所指向位置的值,此时如果执行了 p = &a; *p = 20; ,那么数组 a 的第三个元素将被改为20吗?
如果执行了 p = &a; p = &a; 后*p = 20; ,那么数组 a 的第4个元素将被改为20吗?

isdkz 发表于 2023-6-8 16:58:24

tttttt@@@@@@ 发表于 2023-6-8 16:55
对于*p = a改变了p所指向位置的值,此时如果执行了 p = &a; *p = 20; ,那么数组 a 的第三个元素将 ...

首先需要明确的是, *p = a;这行代码的行为取决于p之前指向了什么。如果p在此之前已经被初始化并指向了某个内存位置,那么*p = a;会将数组a的第一个元素的值赋给p所指向的位置,而不会改变p的指向。

然后,如果你执行了p = &a; *p = 20; ,你首先让p指向了数组a的第三个元素,然后将该位置的值改为了 20。所以,是的,这行代码会使数组a的第三个元素被改为 20。

如果你执行了p = &a; p = &a; *p = 20; ,你首先让p指向了数组a的第三个元素,然后改变了p的指向,让它指向了数组a的第四个元素,然后将该位置的值改为了 20。所以,是的,这行代码会使数组a的第四个元素被改为 20。

tttttt@@@@@@ 发表于 2023-6-9 10:10:08

isdkz 发表于 2023-6-8 16:58
首先需要明确的是, *p = a;这行代码的行为取决于p之前指向了什么。如果p在此之前已经被初 ...

对于*p = a改变了p所指向位置的值此时改变*p的值对应的a的值是不是也会改变

isdkz 发表于 2023-6-9 10:17:34

tttttt@@@@@@ 发表于 2023-6-9 10:10
对于*p = a改变了p所指向位置的值此时改变*p的值对应的a的值是不是也会改变

对于*p = a; ,这条语句做的是把数组a的第一个元素的值复制给了p所指向的位置,并没有改变p的指向。这个操作不会影响到a 。如果你在这之后改变*p的值,这个改变将影响p所指向的位置的值,但不会影响a 。

举个例子,假设你有以下的代码:

int a = {1, 2, 3, 4, 5};
int b = 10;
int *p = &b;// p指向b
*p = a;// 把a的值复制给*p,也就是复制给了b


在这个例子中, *p = a;使b的值变为了 1(因为p指向b ,而a的值是 1)。但是, a的值并没有被改变,仍然是 1。之后如果你改变*p的值,这个改变将影响到b ,但不会影响a 。比如,如果你执行*p = 20; , b的值会变为 20,但a的值仍然是 1。

tttttt@@@@@@ 发表于 2023-6-9 10:20:36

isdkz 发表于 2023-6-9 10:17
对于*p = a; ,这条语句做的是把数组a的第一个元素的值复制给了p所指向的位置,并没有改变...

好的谢谢
页: [1]
查看完整版本: 指针与数组