gpt4 book ai didi

c++ - 设置为值的指针和设置为值地址的指针有什么区别?

转载 作者:行者123 更新时间:2023-11-28 04:14:42 26 4
gpt4 key购买 nike

我有两个问题,真的。第一个与指针和变量之间的交互有关,第二个与指针和数组之间的交互有关。理解这一点的最佳方式是什么?

我知道指针包含指向变量的地址,但我不确定将指针设置为地址和将指针设置为变量之间有什么区别。

我似乎对数组有同样的问题,只是更复杂,因为数组可能不只有一个值。

例如:

int num = 5;
int * p;

p = num; //This results in an error
p = # //This does not

鉴于:

int num[2] = {5, 10};

p = num; //This does not result in an error
p = # //This does

对于第一种情况,我收到一条错误消息:“无法将类型为“int”的值分配给类型为“int *”的实体。

对于第二种情况,我收到一条错误消息,“无法将类型为“int (*)[2]”的值分配给类型为“int *”的实体。

这是为什么?

编辑:我不认为这是一个重复的问题。数组衰减根本没有回答我的问题,相反,这与指针类型有关,而不是数组的属性。这个问题已经得到很好的回答,但我想澄清一下,我的问题没有得到任何与数组衰减有关的回答。

最佳答案

一个变量有许多不同的属性。

根据我在这里引用的变量定义

int num = 5;

它的类型是int,它的名字是num,它的初始化值是5,它的地址(例如位置在机器内存)是&num

如果我要在之后立即定义第二个变量

int q = 5

那么这个变量(如 num)的类型为 int,值为 5,但名称不同 q 和内存中的不同地址 &qnumq 的值虽然相同,但地址不同。这(除其他事项外)确保分配 q = 6 不会更改 num 的值。

它更进一步。样本中的指针

int * p;

表示 p 是指向 int 的指针。它的类型为int *,因此它的值可以是int 的地址。所以作业

p = num;  //This results in an error

不起作用,因为 p 的类型为 int *num 的类型为 int。这两种类型是不同的,int 不能隐式转换为 int *,因此不允许赋值。它们是不同的类型。在现实世界中,房子的街道地址与房子是不同的,即使它们之间存在关联。

但是你的任务

p = # //This does not

有效,因为 pint * 类型,而 &numint 的地址,所以也是类型为 int *

但是,对于数组,规则有点不同。

int num[2] = {5, 10};

p = num; //This does not result in an error
p = # //This does

首先,num 是两个int 的数组。它的名字是num,但它的类型是int[2],它的值实际上是基于一对int 510

在表达式中使用时,num 被转换为指向其第一个元素的指针。所以

p = num;

相当于

p = &num[0];

num&num[0] 的转换称为“数组到指针”的转换。

你试过的第二个作业

p = # //This does 

是不同的。在这种情况下,&num 是数组 num 的地址,而不是其第一个元素的地址。所以 &num 的类型是 int (*)[2],它(在 C++ 中)在句法上意味着“指向两个 int 的数组的指针”。

p 的类型是 int *(因为你就是这样定义它的)而 &num 的结果是 int 类型(*)[2]。这些类型不同,因此分配无效。

如果您想要一个指向两个 int 的数组的变量(与您的 p 不同,它可以指向 数组的第一个元素int) 然后定义

int num[2] = {5,10};
int (*q)[2]; // q has type int (*)[2]

q = num; // this will work

然后你可以做,例如;

std::cout << (*q)[0] << ' ' << (*q)[1] << '\n';

打印值 510。这是有效的,因为 q 指向数组,*q 是(对)数组 num 的引用,所以 (*q) [0](*q)[1] 分别访问 num[0]num[1]

请注意,括号 () 在上述所有讨论中都很关键。 *q[0] 实际上(根据运算符优先级和结合性规则)等同于 *(q[0]) 这与 (* q)[0]。我将解决什么 *(q[0]) 是(或不是)练习。

关于c++ - 设置为值的指针和设置为值地址的指针有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56927321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com