我得到以下代码的输出为 -> 6
我对输出感到困惑,所以我更改了一小部分代码并检查了它。
我将此 int * ptr=(int*)(a+1)
替换为 Not clear 语句,我得到的输出为 --> 1
。怎么办?
听说&a
, a
, a[0]
都是同一个地址?是什么让它与众不同?
#include<stdio.h>
int main()
{
int a[] = {1, 2, 3, 4, 5, 6};
int *ptr = (int*)(&a+1); //NOT CLEAR
printf("%d ", *(ptr-1) );
getchar();
return 0;
}
像许多其他开发人员一样,您对衰减感到困惑。以下代码是有效的,因为 a
将隐式衰减到一个指针:
int a[] = {1,2,3};
int* b = a;
衰减显着地允许数组隐式转换为指向其第一个元素的指针。
但是,以下代码无效,因为衰减与获取数组地址不同:
int a[] = {1,2,3};
int* b = &a; // INVALID
第一个示例为您提供了一个指向整数(数组中的第一个整数)的指针。在第二个示例中,&a
为您提供了一个指向由 3 个整数组成的数组的指针。如果您必须将它分配给一个变量,它的类型将是:
int a[] = {1,2,3};
int (*b)[3] = &a;
外星人的形式应该告诉你这根本不是你所期望的。
的确,a
(一旦衰减)、&a
和 &a[0]
应该都指向同一个地址。但是,它们指向的不是同一种东西(&a
指向数组,而其他指向整数)。
指针操作的结果至少取决于指针的类型和指针的值。每次将 &a
指针增加 1 时,都会在内存中移动三个整数,而不仅仅是一个,因为类型的大小是 (3 * 整数的大小).这就是当您执行 (&a + 1)
时会发生的情况,这就是您得到意外结果的原因。此内存地址未定义任何值,因此您会得到未定义的行为。
它可以编译,因为您将指针转换为 int 指针,如果您需要我的建议,您应该永远消除编译器关于带有转换的指针的警告。