【问题标题】:what is the difference between &a,&a[0],a in c [duplicate]c中的&a,&a [0],a有什么区别[重复]
【发布时间】:2014-07-29 05:35:30
【问题描述】:

我得到以下代码的输出 -> 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;
} 

【问题讨论】:

  • see here 很好的解释
  • aint[6] 类型的数组,因此&amp;aint (*)[6] 类型的指向数组的指针,&amp;a[0] 是指向@ 的第一个元素的指针987654335@,所以是int *

标签: c arrays pointers sizeof


【解决方案1】:

像许多其他开发人员一样,您对衰减感到困惑。下面的代码是有效的,因为a 会隐式衰减到一个指针:

int a[] = {1,2,3};
int* b = a;

衰减是显着允许数组隐式转换为指向其第一个元素的指针的原因。

但是,下面的代码无效,因为衰减和取数组的地址是不一样的:

int a[] = {1,2,3};
int* b = &a; // INVALID

第一个示例为您提供一个指向整数(数组中的第一个整数)的指针。在第二个示例中,&amp;a 为您提供了一个 指向 3 个整数数组的指针。如果必须将其分配给变量,则其类型为:

int a[] = {1,2,3};
int (*b)[3] = &a;

外星人的形式应该告诉你这根本不是你所期望的。

确实a(一旦衰减)、&amp;a&amp;a[0] 都应该指向同一个地址。但是,它们指向的不是同一种东西(&amp;a 指向一个数组,而其他指向整数)。

指针操作的结果至少取决于指针的类型和指针的值。每次将 &amp;a 指针增加 1 时,您在内存中移动 三个整数,而不仅仅是一个,因为类型的大小是(3 * 整数的大小)。这就是您执行(&amp;a + 1) 时会发生的情况,这就是您得到意外结果的原因。此内存地址没有定义任何值,因此您会得到未定义的行为。

它可以编译,因为您将指针转换为 int 指针,如果您需要我的建议,您应该从不使编译器对带有转换的指针发出的警告静音。

【讨论】:

  • +1 这真是太棒了。
【解决方案2】:

让我们看看内存!

|  *  |  *  |  1  |  2  |  3  |  4  |  5  |  6  |  *  |  *  |
               ^     ^                       ^     ^
               |     |                       |     |
               (a)   |                       |     (&a + 1)
                     (a + 1)                 |
                                             (((int *)(&a + 1)) - 1)

【讨论】:

  • 需要一些文字解释。我想是的!!。
  • 您能否解释一下为什么a + 1 将指针前进sizeof(int),但&amp;a + 1 完全跳过了数组?另外,&amp;a + n 会使指针前进多少?
  • (&amp;a) 指向大小为6*sizeof(int) 的对象。所以&amp;a + n 将指向6 * sizeof(int) * n 过去&amp;a 的字节。
【解决方案3】:

数组是存储在连续内存位置的类似数据类型的集合。

数组名代表基地址。 a&amp;a&amp;a[0] 都只是指向数组的起始地址。

但是在你做的代码中(考虑数组的起始地址是1000)

int * ptr=(int*)(a+1) - 它指向数组中的第二个元素 (1004)。 printf("%d ", *(ptr-1) ); 打印第一个元素,因为在 printf 你递减了数组地址

int * ptr=(int*)(&amp;a+1) - 它将指向下一个数组(即 1024)。 printf("%d ", *(ptr-1) ); - 打印1020(即6)位置的元素

int main()
{
   int a[] = {1, 2, 3, 4, 5, 6};
   int *ptr = (int*)(&a+1); // Ptr will point to Starting address of next array. &a+1 increments the whole array size. 
   printf("%d ", *(ptr-1) ); // Due to contiguous memory, when printing you decrements one element. so it prints 6.
   getchar();
   return 0;
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2019-02-20
    • 2020-05-03
    • 2013-06-25
    相关资源
    最近更新 更多