首页 > 试题广场 >

在32位机器上,有如下代码,

[单选题]
在32位机器上,有如下代码:
void func0(){
    char array[] = "abcdefg";
    printf("%d ", sizeof(array));
    const char *p = "abcdefg";
    printf("%d ", sizeof(p));
}
void func1(char p[10])
{
    printf("%d ", sizeof(p));
}
void func2(char (&p)[10])
{
    printf("%d ", sizeof(p));
}
int main()
{
    char p[10] = "hello";
    func0();
    func1(p);
    func2(p);
    printf("%d ", sizeof(char[2]));
    printf("%d ", sizeof(char &));
    return 0;
}
其输出结果为?
  • 8 4 4 10 2 1
  • 4 4 4 10 4 1
  • 8 4 4 10 2 4
  • 8 4 4 4 2 1
  • 8 4 4 10 4 4
  • 以上答案都不对
推荐
A
sizeof求数组时,大小等于数组元素个数*每个元素的大小(其中,计算字符串数组是需要计算结束符'\0',这是与strlen的区别,strlen不计算最后的'\0'),但是当数组是函数的形参时会将会降为指针,在32位系统中无论什么指针类型都是占4个字节
所以:
第1个printf输出:8
第2个printf输出:4
第3个printf输出:4
对于第4个,p是 int[10]的引用,所以
第4个printf输出:10
第5个printf输出:2
第6个printf输出:1
编辑于 2015-09-30 19:03:41 回复(9)
1 chararray[] ="abcdefg";
printf("%d\n",sizeof(array)); 主要是考虑后面还有一个\0;
2 char*p ="abcdefg";
printf("%d\n",sizeof(p));p是一个指针。
3 voidfunc(charp[10])
{
    printf("%d\n",sizeof(p));
}主要考虑的是数组当做参数时退化为指针,故传入的p任然是原指针p的拷贝,也是一个指针
4voidfunc(char(& p)[10])
{
    printf("%d\n",sizeof(p));
    
}p是装10个char类型数据的数组的引用,其结果类似于char p[10];printf("%d\n",sizeof(p));
5    printf("%d\n",sizeof(char[2]));
    printf("%d\n",sizeof(char&));
sizeof对装有2个char数组和char类型的直接操作。
当时自己也没多想把数组当做参数退化为指针给忘了,所以选错了。
发表于 2016-08-22 20:58:57 回复(6)
char(& p)[10] ;sizeof(p): p相当于char[10]的引用,故1*10 = 10;
sizeof(char&): 对引用类型执行sizeof运算得到被引用对象所占空间的大小。【C++ Primer4.9】
发表于 2016-06-26 11:02:33 回复(0)
1. 很明显,求的是字符串的长度
2. 求的是指针变量占用的字节数
3. 形式参数是指针,数组名作为实参时,传递的是指针变量
4. 形式参数是引用,数组名作为实参时,传递的是数组本身
5. 使用C99语法的复合字面量创建临时数组,本质上求的是两个char元素的数组占用的字节数
6. char类型的引用,本质上相当于 sizeof(char)
发表于 2022-03-26 10:41:13 回复(2)
我想说不是所有的程序都是从main函数开始执行的吗?那前面的那几个还能输出吗?main函数又没调用他们,为什么会输出那么多的东西,所以我认为应该选择F ,正确答案应该是:2 1 (C++版本),C语言版本char & 不知道什么类型,所以没有正确答案
发表于 2015-11-08 19:09:45 回复(8)
发现很多同学对最后一个不清楚,其实最后一个就是char的引用,当你对一个对象的引用sizeof的时候就是该引用所绑定对象的大小。其实和第四个是一样的,第四个是一个char型数组的引用,所以sizeof后是该数组所占的大小
发表于 2017-01-06 09:12:25 回复(0)
A
注意的是sizeof(char &)是数组元素的多少。
发表于 2015-02-07 16:51:54 回复(1)
1、char array[] = "abcdefg";:" "表示字符串,the C programme指出,编译器编译时会自动在字符串末尾添加结束符'\0',故sizeof(p):8;
2、char *p = "abcdefg";:p是指向字符串的指针,占用字节为4,故sizeof(p):4;
3、void func(char p[10]){}: 主函数调用中传递给char类型的数组名或指针变量,p表示字符数组的数组名,是一个指针常量,sizeof(p)其所占字节数为4;
4、void func(char (& p)[10]){}:&p表示引用是p的别名,sizeof(p)同3,即值为10,对3、4区别有些不理解,欢迎理解的补充;
5、sizeof(char[2]):蒙的,不懂,欢迎补充
6、sizeof(char &):char类型的引用,半蒙的,不太懂;


编辑于 2020-05-11 16:11:17 回复(0)
ph2头像 ph2
typeid(char&).name() == "char" 
我的理解是 就是一个 char ,第六个所以是1
编辑于 2016-04-02 23:26:07 回复(1)
voidfunc(char(& p)[10])
{
    printf("%d\n", sizeof(p));    
}
如果数组名按值传递,会退化为指针;
如果数组名按引用传递,则不会。
发表于 2018-03-23 11:46:39 回复(0)

当数组做函数形参的时候,会转化为指针,所以第3个应该sizeof(p)应该是指针p所占用的字节数4

发表于 2017-05-22 10:45:27 回复(2)

此题两个地方易错:

  • sizeof(数组名),数组名做函数参数时退化成指针,求sizeof时为指针大小;
  • sizeof(char[2]),有点匿名数组的感觉,new char [2] {'a','b'},在求sizeof时为2
发表于 2021-06-17 14:26:15 回复(0)
这种题目的考点就是对应于数组在传值时退化成指针
发表于 2017-05-29 13:18:52 回复(0)
第4个p是数组的引用,显然大小应为数组的大小。
发表于 2016-05-19 17:18:03 回复(0)
5. 使用C99语法的复合字面量创建临时数组,本质上求的是两个char元素的数组占用的字节数
发表于 2023-03-21 15:07:25 回复(0)
选A
发表于 2020-08-31 11:11:16 回复(0)
第一个是输出8,排除B选项。
由选项可知 第四个选择10,排除D
由排除的B和D可知 最后一个输出1
发表于 2016-06-05 10:42:02 回复(0)
看不懂,没在主函数里怎么能输出呢,而且第三个为什么是4呢
发表于 2016-04-21 17:36:33 回复(0)
在我的IDE中,GCC编译器不认识char & 是什么类型。无法通过编译。
发表于 2023-04-21 08:22:48 回复(0)
发表于 2023-03-03 13:57:39 回复(0)
sizeof(char&): 对引用类型执行sizeof运算得到被引用对象所占空间的大小。【C++ Primer4.9】
发表于 2022-07-27 01:06:17 回复(0)