c - c中的&a,&a[0],a有什么区别

标签 c arrays pointers sizeof

<分区>

我得到以下代码的输出为 -> 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 指针,如果您需要我的建议,您应该永远消除编译器关于带有转换的指针的警告。

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

相关文章:

c++ - 在头文件中初始化常量静态数组

c++ - 使用指向 STL vector 的指针是个好主意吗?

不能在 C 中分配指向原语的指针?

c - 将结构作为参数传递给 pthread

c - 在 C 中通过套接字发送结构

c++ - 我的 header 中需要 #include 指令吗?

java - 使用 MongoDB 和 Java 存储数组

c - kmap_atomic() 的参数(KM_USER1)

c - *arr[] 是什么意思?

c - 如何使用 void * 数据创建结构体?