This question already has answers here:
Closed 5 years ago.
Are a, &a, *a, a[0], &a[0] and &a[0][0] identical pointers?
(8个答案)
我得到以下代码的输出为->6
我被输出搞糊涂了,所以我修改了一小部分代码并检查了它。
我用这个int * ptr=(int*)(a+1)替换了Not clear语句,得到的输出是-->1。怎么用?
我听说,&aaa[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指针,如果您需要我的建议,就不应该用强制转换消除编译器对指针的警告。

关于c - c中&a,&a [0],a和有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25008826/

10-10 02:15