鱼C论坛

 找回密码
 立即注册
查看: 2007|回复: 10

[已解决]小白求助

[复制链接]
发表于 2020-11-2 14:06:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{
        int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int i, year;

        printf("请输入一个年份:");
        scanf("%d", &year);

        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
        {
                days[1] = 29;
        }

        for (i = 0; i < sizeof(days) / sizeof(days[0]); i++)
        {
                printf("%2d月份:%d天\n", i+1, days[i]);
        }


        return 0;
}
i < sizeof(days) / sizeof(days[0]) 这样的形式表达数组的长度,在实际开发中是很常见的技巧,这是什么意思啊?
最佳答案
2020-11-2 15:21:54
sizeof(days)是整个数组的大小
sizeof(days[0])是一个元素的大小
相除就是数组长度了,白话讲数组里面元素的个数

int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
sizeof(days)   12*4=48,int类型占四个字节 ,这里的12 是让你看的明白48是怎么算出来的,实际上编译器是不知道12 的,只知道 数组总长度是 48
sizeof(days[0])  第一个元素占用的字节  因为是int 所以是 4 个字节, 4

sizeof(days) / sizeof(days[0])  数组总长度 / 数组第一个元素的长度   48 / 4  得出,数组里的元素个为 12
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-2 14:09:58 | 显示全部楼层
知道了数组的长度,就知道了数组的边界在哪里呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-2 14:16:01 | 显示全部楼层
风过无痕1989 发表于 2020-11-2 14:09
知道了数组的长度,就知道了数组的边界在哪里呀


i < sizeof(days) / sizeof(days[0])
这个能详细解释一下吗? sizeof 函数不熟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 14:33:30 | 显示全部楼层
吻你不厌 发表于 2020-11-2 14:16
i < sizeof(days) / sizeof(days[0])
这个能详细解释一下吗? sizeof 函数不熟

数组的 sizeof
数组的 sizeof 值等于数组所占用的内存字节数,如:

char a1[] = "abc";
int a2[3];
sizeof( a1 );     // 结果为4,字符末尾还存在一个NULL终止符
sizeof( a2 );     // 结果为3 * 4 = 12(依赖于 int)

把 sizeof 当作了求数组元素的个数,那是不对的,数组元素的个数应该怎么求呢?通常有下面两种写法:

int c1 = sizeof( a1 ) / sizeof( char );       // 总长度 / 单个元素的长度
int c2 = sizeof( a1 ) / sizeof( a1[0] );     // 总长度 / 第一个元素的长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-11-2 15:21:54 | 显示全部楼层    本楼为最佳答案   
sizeof(days)是整个数组的大小
sizeof(days[0])是一个元素的大小
相除就是数组长度了,白话讲数组里面元素的个数

int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
sizeof(days)   12*4=48,int类型占四个字节 ,这里的12 是让你看的明白48是怎么算出来的,实际上编译器是不知道12 的,只知道 数组总长度是 48
sizeof(days[0])  第一个元素占用的字节  因为是int 所以是 4 个字节, 4

sizeof(days) / sizeof(days[0])  数组总长度 / 数组第一个元素的长度   48 / 4  得出,数组里的元素个为 12
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 16:07:01 | 显示全部楼层
百度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-2 19:23:57 | 显示全部楼层
风过无痕1989 发表于 2020-11-2 14:33
数组的 sizeof
数组的 sizeof 值等于数组所占用的内存字节数,如:

int c1 = sizeof( a1 ) / sizeof( char );
这里不应该是sizeof(int)吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 20:43:11 | 显示全部楼层
吻你不厌 发表于 2020-11-2 19:23
int c1 = sizeof( a1 ) / sizeof( char );
这里不应该是sizeof(int)吗?

你有认真看过我的回答吗?我举的例子,你看清楚了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-3 08:21:06 From FishC Mobile | 显示全部楼层
吻你不厌 发表于 2020-11-2 19:23
int c1 = sizeof( a1 ) / sizeof( char );
这里不应该是sizeof(int)吗?

用 数据类型的话,你不觉得太单一了么,适用性也差,用数组名的话,你只需要记住这一个公式,不需要特地的了解数组是什么类型的,以后如果你给别人写接口的话,适用性也比较好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-3 22:57:36 | 显示全部楼层
实习实习 知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-4 19:40:06 | 显示全部楼层

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-11 00:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表