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

时间:2019-07-08 01:18:26

标签: c++ pointers

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

我了解到指针包含指向变量的地址,但是我不确定将指针设置为地址与将指针设置为变量之间有什么区别。

除了数组比较复杂之外,我似乎对数组也有同样的问题,因为数组可能不仅具有一个值。

例如:

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 *”的实体”。

这是为什么?

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

2 个答案:

答案 0 :(得分:1)

变量具有许多不同的属性。

给出您的变量定义,我在这里引用

int num = 5;

其类型为int,其名称为num,它的初始化值为5,其地址(例如,机器内存中的位置)为&num

如果我要紧随其后定义第二个变量

int q = 5

然后,该变量(如num)的类型为int,值为5,但名称不同q,存储器中的地址不同{{1} }。即使&qnum的地址相同,它们的地址也不同。 (除其他事项外)这确保分配q不会更改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 的类型为p,而int *&num的地址,所以类型也为int

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

int *

首先,int num[2] = {5, 10}; p = num; //This does not result in an error p = # //This does 是两个num的数组。它的名称为int,但类型为num,其值实际上基于一对int[2]的{​​{1}}和int

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

10

等同于

num

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

您尝试的第二个作业

num

是不同的。在这种情况下,&num[0]是数组p = # //This does 的地址,而不是其第一个元素的地址。因此&num的类型为num,(在C ++中)在语法上意味着“指向两个&num的数组的指针”。

int (*)[2]的类型为int(因为这是您定义的方式),而p则为类型为int *的结果。这些类型不同,因此分配无效。

如果您想要一个变量,该变量指向两个&num的数组(与int (*)[2]不同,后者可以指向int数组的第一个元素),请定义< / p>

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'; 。之所以有效,是因为5指向数组,10是数组q的引用,因此*qnum访问(*q)[0](*q)[1]

请注意,括号num[0]在以上所有讨论中都是至关重要的。实际上,num[1]()等价(根据运算符优先级和关联性规则)与*q[0]相当。我将不讨论*(q[0])是(或不是)一种练习。

答案 1 :(得分:0)

对于新程序员来说,指针是一大障碍。 让我尝试以最简单的方式进行说明。

指针是C和C ++等语言的数据类型,它指向由指针类型指定的特定“内存位置”,这意味着只有int指针才能指向int内存位置。

在第一个示例中,

p = num

给出错误,因为您试图将指针指向一个值,但是指针不能指向值,而只能指向内存位置。那就是为什么

p = &num 

有效。

在第二个示例中,

p = num

之所以起作用,是因为对于c和c ++中的数组和结构,将指针直接设置为它们会自动指向该数组指定的第一个内存地址。 数组本身不是特殊的数据类型,而是在内存中一个接一个的值序列。 但是,

     p = &num

不起作用,因为您试图指向一个存储位置的存储位置。 num已经指向数组中的第一个位置,而&num指向该位置的内存位置。这就是为什么这是一个错误。 希望你明白了!