我确实有两个问题。第一个与指针和变量之间的交互有关,第二个与指针和数组之间的交互有关。最好的理解方式是什么?
我了解到指针包含指向变量的地址,但是我不确定将指针设置为地址与将指针设置为变量之间有什么区别。
除了数组比较复杂之外,我似乎对数组也有同样的问题,因为数组可能不仅具有一个值。
例如:
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 *”的实体”。
这是为什么?
编辑:我不认为这是重复的问题。数组衰减根本无法回答我的问题,而是与指针类型有关,而不是数组的属性。这个问题已经得到很好的回答,但是我想澄清一下,与数组衰减无关的任何问题都无法回答我的问题。
答案 0 :(得分:1)
变量具有许多不同的属性。
给出您的变量定义,我在这里引用
int num = 5;
其类型为int
,其名称为num
,它的初始化值为5
,其地址(例如,机器内存中的位置)为&num
如果我要紧随其后定义第二个变量
int q = 5
然后,该变量(如num
)的类型为int
,值为5
,但名称不同q
,存储器中的地址不同{{1} }。即使&q
和num
的地址相同,它们的地址也不同。 (除其他事项外)这确保分配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
的引用,因此*q
和num
访问(*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指向该位置的内存位置。这就是为什么这是一个错误。 希望你明白了!