A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liu1170486003 中级黑马   /  2015-1-13 14:06  /  1393 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

虽然sizeof视频里只是简单的提了一下,但是记得以前学sizeof的时候,记得当时把我搞得晕头转向。现在来重新学习一下。我先来一发:
  1. #include <stdio.h>

  2. int testIntArr(int a[])
  3. {
  4.         return sizeof(a);
  5. }

  6. int main(int argc, char *argv[])
  7. {
  8.         int a[10];

  9.         printf("%d\n", sizeof(a));
  10.         printf("%d\n", sizeof(*a));
  11.         printf("%d\n", testIntArr(a));

  12.         return 0;
  13. }
复制代码
输出:
40
4
4
大家解释下




8 个回复

倒序浏览
第一个是把整个数组所占的字节传进去,所以是40;
第二个传入的指针,指针只占4个字节,所以是4;
最后一个嘛,是因为int a[10]分配了10个int类型的空间,
而后声明的int a[]没有分配空间,默认为1,所以也为4。
回复 使用道具 举报
晓风_残月 发表于 2015-1-13 14:28
第一个是把整个数组所占的字节传进去,所以是40;
第二个传入的指针,指针只占4个字节,所以是4;
最后一个 ...

我是这么理解的
sizeof(a)直接求整形数组a的长度,整型占4个字节,数组里有10个整型的位置,所以返回4x10=40
sizeof(*a)是求指向数组a的指针的长度,也就是一个指针的长度,指针占4字节,所以返回4;
sizeof(testIntArr(a))这句中转去函数testIntArr()去执行,返回的是函数的形参的长度,我觉得你的解释不对,因为下面是我的测试程序:
  1. #include <stdio.h>

  2. char testCharArr(char a[])
  3. {
  4.         return sizeof(a);
  5. }

  6. int main(int argc, char *argv[])
  7. {
  8.         char a[10];

  9.         printf("%d\n", sizeof(a));
  10.         printf("%d\n", sizeof(*a));
  11.         printf("%d\n", testCharArr(a));

  12.         return 0;
  13. }
复制代码

输出:
10
1
4
说明这里返回的肯定不是数组长度为1的形参类型数组的长度,而是一个指针,长度为4,总结来说就是当数组是形参的时候,数组名称是一个指针。
回复 使用道具 举报
a等价于 &a[0]
char testCharArr(char a[])
{
        return sizeof(a);
}退化为指针
回复 使用道具 举报
lgh1992314 发表于 2015-1-13 15:29
a等价于 &a[0]
char testCharArr(char a[])
{

恩,刚好看到数组这一块,如下代码是证明数组作为参数的时候,数组名退化为指针:
  1. #include <stdio.h>

  2. char testCharArr(char a[])
  3. {
  4.                 printf("%p\n", a);//作为参数的数组a的首地址
  5.                 printf("%p\n", &a);//
  6.         return sizeof(a);
  7. }

  8. int main(int argc, char *argv[])
  9. {
  10.         char a[10];
  11.                 printf("%p\n", a);//数组a的首地址
  12.         printf("%d\n", testCharArr(a));

  13.         return 0;
  14. }
复制代码


输出:
0028FF16
0028FF16
0028FF00
4
可以看出在main函数中声明的数组a的首地址,与将数组a作为参数调用后,在函数testCharArr中接收到的数组地址相同,也就是说传参是将数组a的地址传过去了,那么函数中的形参保存的就是一个指针,指向原来数组的首地址。函数中的形参是一个新的指针,这个指针指向的地址才是原数组的地址,这个形参本身的地址是创建的新指针的地址。
回复 使用道具 举报
视频里Mac64位编译器环境下的指针是占8位的,而我是在windows下用devcpp写的C程序,所以指针长度是4位的。
回复 使用道具 举报
liu1170486003 发表于 2015-1-13 14:58
我是这么理解的
sizeof(a)直接求整形数组a的长度,整型占4个字节,数组里有10个整型的位置,所以返回4x10 ...

MJ老师 不就说了 调用函数的时候 会变为指针传进去嘛
回复 使用道具 举报
Drmshow 发表于 2015-1-13 19:09
MJ老师 不就说了 调用函数的时候 会变为指针传进去嘛

是的,今天下午后来看到那部分了,不过好在之前我已经自己弄明白了,听着就轻松多了
回复 使用道具 举报
liu1170486003 发表于 2015-1-13 14:58
我是这么理解的
sizeof(a)直接求整形数组a的长度,整型占4个字节,数组里有10个整型的位置,所以返回4x10 ...

嗯,。哈哈,感觉是这样。一开始还是没想明白为什么是4,你这么说我觉得还是有道理的,共同进步了哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马