2015-07-10 31 views
-3

有人请解释下面的代码的输出数组的地址..打印使用“数组名”和“数组名地址的”

#include <stdio.h> 

    int main() 
    { 
     int arr[5]; 
     // Assume base address of arr is 2000 and size of integer is 32 bit 
     printf("%u %u", arr + 1, &arr + 1);   
     return 0; 
    } 

也解释了当的“printf”语句通过以下

1. printf("%u %u", arr + 1, &(arr + 1)); 
2. printf("%u %u", arr + 1, &arr + 2); 
+2

是你期待什么输出& &? – Raman

+2

你也应该使用%p来打印地址。 – Raman

+0

数组的地址('&arr')和数组第一个元素的地址('&arr [0]' - 当arr衰变为指针时得到的数值)具有相同的数值,但并不意味着相同事情。 – molbdnilo

回答

1

首先,它是更好地使用格式说明%p,专门为指针,而不是格式说明符设计取代%u

在此语句

printf("%u %u", arr + 1, &arr + 1); 

在表达arr + 1阵列arr被转换为指针到它的第一个元素。所以它在转换后输入int *,相应地它指向的元素的类型为int。由于指针算术表达式arr + 1将指向数组的第二个元素的下一个元素。所以指针的值arr + 1 is greater than the value of pointer ARR by的sizeof(int)的`

在这个表达式中&arr + 1指针&arr已键入int (*)[5]。它指向的元素(即数组arr)的类型为int[5]。因此,通过sizeof(int[5])

至于表达&(arr + 1)表达&arr + 1&arr价值更大的价值,那么它不会编译,因为arr + 1是临时对象,你可以不采取临时对象的地址。

+0

只是为了完成:“'arr + 1'是一个临时对象”..而不是'lvalue' ... –

0

的第一printf输出将是(根据假设指定) - 2032 2160

arr+1指向下一个即ARR元件[1]和在该arr&arr+1是INT(*)[5]的点到int [5],因此address of arr that is base address加上int [5]的大小(这里是你的情况5 * 32)。

在你的第二个printf&(arr+1)不是左值,因此不会占用内存中的某些可识别的位置。因此会给出错误。

printf会给出2032 2320的输出。可以按第1个printf的方式进行评估。

0

的上面的代码的输出是2004年到2020年

值ARR和& ARR收率相同的结果阵列是未初始化它将打印在地方它的值的地址的值。

这是由于这样的事实BCZ当u打印(ARR + 1)的,它增加了数组类型,即INT(4字节)的大小导致

但是当u做(&(ARR + 1)),它会将整个数组的大小(即(5 * 4 = 20个字节))加到基地址上。

当U打印&(ARR + 1),它会产生错误BCZ它现在将当作一元不寻址操作

+0

Vishesh请看他在他的问题中指定的整数大小。整数大小不一定总是4个字节。 – ameyCU

+0

Amey你正确的整数的abt大小并不总是4字节。它随着操作系统的ur位版本而变化。我以字节的形式给出了我的答案,因为他没有提到位/字节的值为2000 – Vishesh