因此,我读过某个地方,以防万一我们有一个指针p,并且一些值i和j一个接一个地定义,那么堆栈上的那些值将一个接一个 但是至少对我而言似乎并非如此。
int i = 10;
int j = 20;
int *p = &i;
p++;
(*p) = 30;
std::cout << i << " " << j << " " << (*p) << "\n" ;
相反,它将打印这些值10 20 30
如果我在(*p) = 30;
内评论了*p
,将是一个空地址。
我认为在这种情况下,++运算符会将我的引用从i
更改为j
,而(*p)
将更改j
的值,但这不是显然不是这样。
所以我想知道它们是什么意思?
答案 0 :(得分:11)
您的代码的行为是未定义。
指针算术仅在数组内有效。您不能通过增加指向另一个对象的指针并取消对该指针的引用来访问该对象。更详细一点,定义了 public static void main (String args[]) {
int sonAge = 10;
int fatherAge = 24;
int yearsAgo = 0;
while(sonAge*2 != fatherAge && fatherAge>0 ) {
yearsAgo++;
fatherAge = fatherAge-1;
}
System.out.println(yearsAgo);
}
(可以将一个对象视为单个元素数组,并且可以将指针设置为指向数组末尾的指针),但是后续的取消引用是未定义的。 / p>
答案 1 :(得分:3)
我认为在这种情况下,++运算符会将我的引用从i更改为j和t。...
那是错的。对于此定义:
int i = 10;
int j = 20;
没有规则将j
存储在与i
相邻的存储位置中。
此外,不要将指针(抽象概念)与它们建模的内容(物理内存地址)混淆。在大多数情况下,可以将指针视为物理内存中的地址,但是严格来讲,并不是。
C ++标准为指针定义了某些规则以及您可以使用它们做什么。递增指向int
的指针以获取指向紧随其后定义的另一个int
的指针不是这些规则之一!请注意,即使在您的硬件内存中,这两个整数也将存储在相邻的内存中,然后仍然递增指向i
的指针,然后对其取消引用是未定义的行为。
答案 2 :(得分:2)
++
运算符将指向内存中的下一个位置,而不是下一个变量。
如果您有int i[2] = {10, 20};
,则p++
将指向i[1]
,即20
答案 3 :(得分:2)
如果要具有连续的内存位置,则需要声明一个数组。由于您的数据类型较小,因此libc会分配位置。指针占据声明的变量周围的空间。