首页 > 试题广场 >

下列代码的结果是

[单选题]
下列代码的结果是
#include<stdio.h>
main() { 
    int a[5] = {1, 2, 3, 4, 5}; 
    int *ptr = (int *)(&a + 1); 
    printf("%d,%d", *(a + 1), *(ptr - 1)); 
}
  • 3,5
  • 2,4
  • 2,5
  • 3,4
推荐
C ,a代表了数组的整体,&a+1就超出了数组的范围
编辑于 2015-04-01 16:37:18 回复(3)
数组名就是数组0号元素的地址。 
a = &a[0] 
&a 是指向一个有5个整型元素的数组的地址。 a是一维指针,&a相当于是二维指针。 &a+1 就是从a向后跳过一个完整的数组所占用的内存空间。 整型5个元素的数组占用 5*sizeof(int)=5*4=20,所以 &a+1应该从a向后跳20字节。正好指到a[4]的后面。ptr是int *, 减1就是向前跳4个字节,ptr-1正好指向a[4]
发表于 2015-07-26 14:29:21 回复(4)
发表于 2017-08-13 17:17:56 回复(0)
如下

发表于 2023-03-14 10:29:44 回复(3)
C
int *ptr=(int*)(&a+1) => int *ptr=(int*)(a地址 + sizeof(a))
sizeof(a) = 5*sizeof(int)
发表于 2015-04-09 13:07:38 回复(0)
这对于c中访问最后一个元素来说非常高效
发表于 2018-03-10 13:21:58 回复(0)
&a,此时的a并不会被看成指针,数组名在decltype、sizeof、&运算符下不会向指针转换
发表于 2015-04-05 09:17:45 回复(0)
C.
*(a+1),a是一维数组的地址,也可以看作是int*,而对指针进行+1操作时,跳过的字节数等于指针指向类型的大小,即4个字节。
(&a+1),&a是a的地址,&a指向的是a数组int[5],即int (*)[5],+1操作跳过指向的类型int[5],即跳过20个字节。
发表于 2015-08-12 22:52:09 回复(0)
    先看第一个输出的值 *(a+1) : a 表示 数组首元素a[0], *(a+1) 即 *(a[0]+1) ,而*(a[0]+1) 其实表示 *(a[1]) ,也就是 2;
    再让再看第二个输出的值*(ptr -1):ptr 即 &a+1,&a 表示 整个数组,即 5*4(int)= 20字节。&a+1 则为 数组后4字节的位置,也就是a[4]的后面。而*(ptr-1)则为是在a[4]后面向前跳4个字节,也就是跳到了a[4]的位置,即 5.
    故代码的结果为 2,5
发表于 2021-03-02 16:08:04 回复(0)
C &a+1是指整个数组a的偏移,即a地址+sizeof(a)
发表于 2015-04-09 17:06:11 回复(0)
    数组名a代表首元素地址,即一维指针,那么&a相当于二维指针,&a+1即从a向后跳过一个完整的数组所占用的内存空间,即ptr指向a[4]的后面。
    
发表于 2017-04-10 21:28:33 回复(3)
a代表数组的第一个元素  a = &a[0]  ,而&a+1就意思在整个大数组基础上,地址加“1“
#include <stdio.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
    int a[5] = {1,2,3,4,5};
    int *ptr = (int *)(&a+1);
    printf("ptr=%d\n",ptr);
    printf("&a[4]=%d\n",&a[4]);
    printf("%d,%d\n",*(a+1),*(ptr-1));
    //printf("%d,%d\n",*a+1,*(ptr-1));
    return 0;
}
运行结果
ptr=600007684
&a[4]=600007680
2,5



发表于 2015-10-27 15:12:11 回复(0)
当求sizeof和取地址时,数组名就代表整个数组
发表于 2015-08-20 22:28:16 回复(0)
这个地方要注意&a和a的值是一样的,但是一个被解释为指向int数组,一个被解释为指向int变量
发表于 2019-03-06 17:52:16 回复(0)
C
&a的类型是int(*p)[5]    p is a ponter which points to array. &a+1指向a[5]的地址(越界),之后强制转换为int *

发表于 2015-04-02 23:00:04 回复(0)

图片说明

发表于 2022-06-24 09:25:47 回复(0)
a本身就是数组首元素地址了,我的理解是在对a取地址&a代表的就是整个数组的地址了,&a+1就跳过整个数组a[5],指向了5后面的地址
发表于 2022-03-22 09:07:46 回复(1)
  1. int a[5] = {1, 2, 3, 4, 5};:定义了一个包含5个整数的数组a,并初始化为 {1, 2, 3, 4, 5}。
  2. int *ptr = (int *)(&a + 1);:将指针ptr指向数组a之后的内存位置。注意,&a是整个数组的指针,&a + 1指向了数组a之后的内存位置,而不是数组a的最后一个元素的位置。
  3. printf("%d,%d", *(a + 1), *(ptr - 1));:输出第二个元素a[1]的值和指针ptr指向的位置的前一个整数值。

由于*(a + 1)是数组a的第二个元素,也就是2,而*(ptr - 1)是ptr指针前一个位置的值。由于ptr指向了数组a之后的位置,所以ptr - 1指向了数组a的最后一个元素的位置,也就是5。

所以,这段代码会输出:2,5。

发表于 2023-08-01 17:12:40 回复(0)
这是个很有趣的题目
sizeOf(a) = 20,&a+1,故向后进了20个字节,即prt指向了下一个数组的首地址(只为了方便理解).
prt 是 int*,sizeOf(prt) = 4, prt-1 故前退四个字节,也就指向了5.
*(a+1) = a[1] = 2;
发表于 2022-03-10 23:12:43 回复(0)
int *ptr=(int *)(&a+1); 表示ptr指向下一片区域的首地址。 *(ptr-1)表示该数组的最后一个元素,也就是下一片区域的前一个元素。
发表于 2019-04-15 11:31:38 回复(0)
这个2是什么意思?看来上面的解析还是没懂,*(&a+1)是让求数组的个数吗?求大神指点一下
编辑于 2017-06-22 16:47:56 回复(0)