鱼C论坛

 找回密码
 立即注册
查看: 1230|回复: 8

[已解决]指针与数组

[复制链接]
发表于 2023-6-8 10:27:23 | 显示全部楼层 |阅读模式
1鱼币
在指针与数组中对于*p=a[0]是不是不可以是不是只有*p=&a[0]或者p=a可以
最佳答案
2023-6-8 10:27:24
在C和C++语言中,数组名代表的是数组的首地址。比如你有一个数组  int a[5]; ,那么  a  就表示这个数组的首地址。也就是说,数组的名字是一个指向数组首元素的指针。

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

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

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

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

最佳答案

查看完整内容

在C和C++语言中,数组名代表的是数组的首地址。比如你有一个数组 int a[5]; ,那么 a 就表示这个数组的首地址。也就是说,数组的名字是一个指向数组首元素的指针。 如果你有一个指针 int *p; ,你可以将数组的地址赋给它: p = a; 。这将使 p 指向数组 a 的第一个元素。之后,你可以用 *p 来访问或者修改数组的第一个元素。 因此 *p = a[0]; 和 p = &a[0]; 是不同的。前者是将数组的第一个元素的值赋给指针所 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-8 10:27:24 | 显示全部楼层    本楼为最佳答案   
在C和C++语言中,数组名代表的是数组的首地址。比如你有一个数组  int a[5]; ,那么  a  就表示这个数组的首地址。也就是说,数组的名字是一个指向数组首元素的指针。

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

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

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

而  p = &a[0];  和  p = a;  是等价的,都是将数组的首地址赋给了指针  p 。注意,这并不会改变  p  所指位置的值,而是改变  p  所指向的位置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-8 15:13:54 | 显示全部楼层
isdkz 发表于 2023-6-8 10:53
在C和C++语言中,数组名代表的是数组的首地址。比如你有一个数组  int a[5]; ,那么  a  就表示这个数组的 ...

那在这三种情况下改变*p或者p对a的值都会有影响吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

总结一下, *p 是指针 p 所指向的位置的值,改变 *p 的值会影响到这个位置的值。 p 是指针本身,改变 p 的值(让 p 指向另一个位置)只会影响到 p 自己,不会影响到原来 p 所指向的位置的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

对于*p = a[0]改变了p所指向位置的值,此时如果执行了 p = &a[2]; *p = 20; ,那么数组 a 的第三个元素将被改为20吗?
如果执行了 p = &a[2]; p = &a[3]; 后  *p = 20; ,那么数组 a 的第4个元素将被改为20吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-8 16:58:24 | 显示全部楼层
tttttt@@@@@@ 发表于 2023-6-8 16:55
对于*p = a[0]改变了p所指向位置的值,此时如果执行了 p = &a[2]; *p = 20; ,那么数组 a 的第三个元素将 ...

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

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

如果你执行了  p = &a[2]; p = &a[3]; *p = 20; ,你首先让  p  指向了数组  a  的第三个元素,然后改变了  p  的指向,让它指向了数组  a  的第四个元素,然后将该位置的值改为了 20。所以,是的,这行代码会使数组  a  的第四个元素被改为 20。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-9 10:10:08 | 显示全部楼层
isdkz 发表于 2023-6-8 16:58
首先需要明确的是, *p = a[0];  这行代码的行为取决于  p  之前指向了什么。如果  p  在此之前已经被初 ...

对于*p = a[0]改变了p所指向位置的值此时改变*p的值对应的a[0]的值是不是也会改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-9 10:17:34 | 显示全部楼层
tttttt@@@@@@ 发表于 2023-6-9 10:10
对于*p = a[0]改变了p所指向位置的值此时改变*p的值对应的a[0]的值是不是也会改变

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

举个例子,假设你有以下的代码:
int a[5] = {1, 2, 3, 4, 5};
int b = 10;
int *p = &b;  // p指向b
*p = a[0];  // 把a[0]的值复制给*p,也就是复制给了b

在这个例子中, *p = a[0];  使  b  的值变为了 1(因为  p  指向  b ,而  a[0]  的值是 1)。但是, a[0]  的值并没有被改变,仍然是 1。之后如果你改变  *p  的值,这个改变将影响到  b ,但不会影响  a[0] 。比如,如果你执行  *p = 20; , b  的值会变为 20,但  a[0]  的值仍然是 1。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-9 10:20:36 | 显示全部楼层
isdkz 发表于 2023-6-9 10:17
对于  *p = a[0]; ,这条语句做的是把数组  a  的第一个元素的值复制给了  p  所指向的位置,并没有改变  ...

好的谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 10:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表