首页 > 试题广场 >

关于 int a[10]; 问下面哪些不可以表示 a[1]

[单选题]
关于 int a[10]; 问下面哪些不可以表示 a[1] 的地址()
  • a+sizeof(int)
  • &a[0]+1
  • (int*)&a+1
  • (int*)((char*)&a+sizeof(int))
推荐
A. a+sizeof(int) 
// 不正确, 在32位机器上相当于指针运算 a + 4
B. &a[0]+1 
// 正确,数组首元素地址加1,根据指针运算就是a[1]的地址
C. (int*)&a+1 
// 正确,数组地址被强制类型转换为int*,然后加1,这样和B表示的一个意思
D. (int*)((char*)&a+sizeof(int))
// 正确,数据地址先被转换为char*,然后加4,根据指针运算公式,向前移动4 * sizeof(char),之后被转换为int*,显然是a[1]的地址
编辑于 2015-02-04 10:43:26 回复(8)
参考别人的
int main()
{ int a[10] = { 1,2,3,4,5,6,7,8,9,0 }; printf("*******输出地址*******\n"); printf("a[0] = %d\n",a); printf("a+sizeof(int) = %d\n",a+sizeof(int)); //a+1为地址加4,这里相当于地址加了16 printf("&a[0] + 1 = %d\n",&a[0] + 1); // 这个加1也是地址加4 printf("(int*)&a+1 = %d\n",(int*)&a+1); // 加1也是地址加5
printf("(int*)((char*)&a+sizeof(int)) = %d\n",(int*)((char*)&a+sizeof(int)));//这里先把地址变成指向char类型指针,然后+4就是按char类型长度加,最后变成指向整型
printf("\n"); printf("*******输出值*********\n"); printf("a[0] = %d\n",*a); printf("a+sizeof(int) = %d\n",*(a+sizeof(int))); printf("&a[0] + 1 = %d\n",*(&a[0] + 1)); printf("(int*)&a+1 = %d\n",*((int*)&a+1)); printf("(int*)((char*)&a+sizeof(int)) = %d\n",*((int*)((char*)&a+sizeof(int)))); return 0; }
发表于 2016-07-14 19:52:39 回复(0)
啥头像
指针的运算,要看类型。  a是int型指针,
A中         a+4相当于a的基础上偏移4*4个偏移量,所以不对

但是C、D应该改成下面这样才对吧:
C     (int*)&a[0]+1
D     (int*)((char*)&a[0]+sizeof(int))
发表于 2016-01-03 16:16:49 回复(3)
A. a+sizeof(int) 
// 不正确, 在32位机器上相当于指针运算 a + 4
B. &a[0]+1 
// 正确,数组首元素地址加1,根据指针运算就是a[1]的地址
C. (int*)&a+1 
// 正确,数组地址被强制类型转换为int*,然后加1,这样和B表示的一个意思
D. (int*)((char*)&a+sizeof(int))
// 正确,数据地址先被转换为char*,然后加4,根据指针运算公式,向前移动4 * sizeof(char),之后被转换为int*,显然是a[1]的地址
发表于 2017-07-29 22:32:32 回复(0)
A错误,不可以对数组名进行运算
发表于 2015-10-08 09:19:08 回复(1)
NJ头像 NJ
C项应该是(int *)(&a[0] + 1)
编辑于 2017-08-18 09:50:45 回复(1)
题目要选的是不能。
A:sizeof(int) a指针为int型指针,将向后移动两个int空间,指向a[2]
B:&a[0] int型指针,向后移动一个int,指向a[1]
C:&a虽然为数组指针,但是强制变为int型指针,移动一个int,指向a[1]
D:char型指针,移动一个int的size大小后指向第二个数组元素a[1]的地址,转换为int型指针指向a[1]
发表于 2016-10-12 22:54:57 回复(0)
这道题最容易迷惑的地方是int *p=(int *)&a+1 和 int *p=(int *)(&a+1)的区别,前者将a的步长强制变成1, 后者则先进行加法操作,步长是数组长度10然后再进行地址转换,这其中的区别很重要
发表于 2016-08-05 20:59:08 回复(0)
注意强制类型转换,char类型占一个字节,int占4个字节

发表于 2016-04-26 21:54:29 回复(0)
对选项C进行解释一下:&a是数组指针,其基础大小为4*10个字节,如果不加强制转换,则&a+1应该代表的是a[10]的位置;
其次,强制转换的优先级大于取算数运算,所以,先把&a强制转换为int型,那么其基础大小就转为了4个字节了。
发表于 2017-08-10 11:30:03 回复(0)
1,对于选项A,应该是a+1,而不是a+sizeof(int),指针加减一个整数,地址值的变化量是该整数乘以指针所指元素的大小 2,取地址符号&返回的值不是地址对应的那个数字,而是一个指针变量。
编辑于 2016-10-30 20:22:37 回复(0)
A可以看作是a[0]+4,也就是a[4],当然和a[1]不一样了
发表于 2025-04-02 17:09:24 回复(0)
强制类型转换(值和地址) ********************************************** 1. 对变量的值进行强制类型转换,是把值按照另一种类型进行存储后读取,变量在内存中的存储形式发生变化。 ********************************************** 2. 对变量地址进行强制类型转换,是变量在内存中的存储形式未发生变化,而在变量读取时读取方式发生变化。 例如: int m; int *pm=&m; char *cp=(char *)&m; pm指向一个整型,cp指向整型数的第一个字节。
编辑于 2018-09-26 13:26:03 回复(0)
#include <stdio.h>

int main(void)
{
    
    int a[10] = {0,1,2,3,4,5,6,7,8,9};
    printf("%d\n",*(a+sizeof(int)));
    printf("%d\n",*(&a[0]+1));
    printf("%d\n",*((int*)&a+1));
    printf("%d\n",*((int*)((char*)&a+sizeof(int))));
    
    return 0;
}


结果是  4 1 1 1

发表于 2018-07-15 23:39:23 回复(0)
指针的运算,指针加的整数,是整数乘以指针所指类型的大小。 &a是指针数组,可以强制转换为int指针类型。
发表于 2018-03-08 22:16:14 回复(0)
地址需要指针,a没有指针,bcd都有
发表于 2017-11-07 09:05:51 回复(0)
有人和我一样A,B答案都不同啊
发表于 2017-06-18 09:54:19 回复(0)
a本来就是地址,不能对地址再取地址。 D还是不懂,需要研究。
编辑于 2016-01-09 16:47:43 回复(0)
我明明选的a为啥算我错!
发表于 2015-08-08 14:44:45 回复(0)
a本来就是地址,对a取地址,再加1怎么就是对的
发表于 2015-08-04 07:11:37 回复(4)
A怎么错了?B为什么对?
发表于 2015-06-20 12:18:29 回复(0)