写完这几组题,我的大脑得到了升华

关于数组名
数组名是数组首元素的地址
但是有2个例外:
1. sizeof(数组名) - 数组名表示整个数组,计算的是整个数组的大小,单位是字节
2. &数组名 - 数组名也表示整个数组,取出的是整个数组的地址
除了这个2个例外,你见到的所有的数组名都表示首元素的地址

 

// 一维数组
int a [] = { 1 , 2 , 3 , 4 };
printf ( "%d\n" , sizeof ( a ));              //a单独放在sizeof内部表示整个数组,所以是4*4= 16 个字节
printf ( "%d\n" , sizeof ( a + 0 ));          //a代表数组首元素地址,加0仍指向数组首元素,所以是 4/8 个字节
printf ( "%d\n" , sizeof ( * a ));            //a代表数组首元素地址,*a是第一个整数,所以是 4 个字节
printf ( "%d\n" , sizeof ( a + 1 ));         //a代表数组首元素地址,a+1代表第二个元素的地址,所以是 4/8 个                                                     字节
printf ( "%d\n" , sizeof ( a [ 1 ]));          //a[1]是第二个元素,是整形元素,所以是 4 个字节
printf ( "%d\n" , sizeof ( & a ));            //&a是整个数组的地址,所以是 4/8 个字节
printf ( "%d\n" , sizeof ( *& a ));        //*&a即为a,a单独放在sizeof内部表示整个数组,所以是4*4= 16 个字                                                    节
printf ( "%d\n" , sizeof ( & a + 1 ));      //&a是整个数组的地址,&a+1即跳过整个数组,但仍是地址,所以                                                     是 4/8 个字节

printf ( "%d\n" , sizeof ( & a [ 0 ]));       //a[0]是首元素,&a[0]是首元素的地址,所以是 4/8 个字节
printf ( "%d\n" , sizeof ( & a [ 0 ] + 1 ));   //a[0]是首元素,&a[0]是首元素的地址,&a[0]+1是第二个元素的地                                                       址,所以是 4/8 个字节
sizeof 是计算对象或者类型创建的对象所占内存空间的大小,单位是字节
sizeof 是操作符,不是函数
strlen 求字符串长度的,计算的是字符串中\0之前出现的字符的个数
/统计到\0为止,如果没有看到\0,会继续往后找
strlen 是库函数
stelen的()里放的必须是地址,如果是一个数则会将那个数的ASCII码值当成了地址
// 字符数组
char arr [] = { 'a' , 'b' , 'c' , 'd' , 'e' , 'f' };     //数组中只有6个元素无’\0‘ 
printf ( "%d\n" , sizeof ( arr ));            //arr单独放在sizeof内部表示整个数组,所以是1*6= 6 个字节
printf ( "%d\n" , sizeof ( arr + 0 ));       //arr代表数组首元素地址,加0仍指向数组首元素,所以是 4/8 个字                                                        节
printf ( "%d\n" , sizeof ( * arr ));         //arr代表数组首元素地址,*arr是第一个元素,所以是 1 个字节
printf ( "%d\n" , sizeof ( arr [ 1 ]));      //arr[1]是第二个元素,是char型元素,所以是 1 个字节
printf ( "%d\n" , sizeof ( & arr ));        //&arr是整个数组的地址,所以是 4/8 个字节
printf ( "%d\n" , sizeof ( & arr + 1 ));    //&arr是整个数组的地址,&arr+1即跳过整个数组,但仍是地址,                                                         所以是 4/8 个字节
printf ( "%d\n" , sizeof ( & arr [ 0 ] + 1 )); //arr[0]是首元素,&arr[0]是首元素的地址,&arr[0]+1是第二个元                                                            素的地址,所以是 4/8 个字节
printf ( "%d\n" , strlen ( arr ));            //arr是数组名表示数组首元素地址,strlen计算的是字符串中\0之                                                           前出现的字符的个数,数组中,没有\0所以是 随机值
printf ( "%d\n" , strlen ( arr + 0 ));      //arr+0也是数组名表示数组首元素地址,strlen计算的是字符串中\0                                                           之前出现的字符的个数,数组中,没有\0所以是 随机值
printf ( "%d\n" , strlen ( * arr ));        //arr是数组名表示数组首元素地址,*arr是第一个元素即'a',a的                                                              ASCII码值 97被 当成了地址,会非法访问,所以会报错, err
printf ( "%d\n" , strlen ( arr [ 1 ]));    // arr是第二个元素即'b',b的ASCII码值 98被 当成了地址,会非法访                                                           问,所以会报错, err
printf ( "%d\n" , strlen ( & arr ));       //&arr是整个数组的地址,但strlen计算的是字符串中\0之                                                                           前出现的字符的个数,数组中,没有\0所以是 随机值
printf ( "%d\n" , strlen ( & arr + 1 ));    //&arr是整个数组的地址,&arr+1即跳过整个数组,但仍是地址,                                                              数组中,没有\0所以是 随机值
printf ( "%d\n" , strlen ( & arr [ 0 ] + 1 )); //arr[0]是首元素,&arr[0]是首元素的地址,&arr[0]+1是第二个元                                                            素的地址,所以是 随机值
char arr [] = "abcdef" ;                    //数组中包含’\0'
printf ( "%d\n" , sizeof ( arr ));            //arr单独放在sizeof内部表示整个数组,所以是1*7= 7 个字节
printf ( "%d\n" , sizeof ( arr + 0 ));       //arr代表数组首元素地址,加0仍指向数组首元素,所以是 4/8 个字                                                        节
printf ( "%d\n" , sizeof ( * arr ));          //arr代表数组首元素地址,*arr是第一个元素,所以是 1 个字节
printf ( "%d\n" , sizeof ( arr [ 1 ]));       //arr[1]是第二个元素,是char型元素,所以是 1 个字节
printf ( "%d\n" , sizeof ( & arr ));         //&arr是整个数组的地址,所以是 4/8 个字节
printf ( "%d\n" , sizeof ( & arr + 1 ));     //&arr是整个数组的地址,&arr+1即跳过整个数组,但仍是地址,                                                            所以是 4/8 个字节
printf ( "%d\n" , sizeof ( & arr [ 0 ] + 1 ));   //arr[0]是首元素,&arr[0]是首元素的地址,&arr[0]+1是第二个元                                                            素的地址,所以是 4/8 个字节
printf ( "%d\n" , strlen ( arr ));             //arr表示数组首元素地址,共6个字符类型元素,所以 6 是个字节
printf ( "%d\n" , strlen ( arr + 0 ));      //arr+0表示数组首元素地址,共6个字符类型元素,所以 6 是个字节
printf ( "%d\n" , strlen ( * arr ));         //arr是数组名表示数组首元素地址,*arr是第一个元素即'a',a的                                                              ASCII码值 97被 当成了地址,会非法访问,所以会报错, err
printf ( "%d\n" , strlen ( arr [ 1 ]));    // arr是第二个元素即'b',b的ASCII码值 98被 当成了地址,会非法访                                                           问,所以会报错, err
printf ( "%d\n" , strlen ( & arr ));       //&arr是整个数组的地址,strlen计算的是字符串中\0之前出现的字                                                        符的个数,所以是6个字节
printf ( "%d\n" , strlen ( & arr + 1 ));   //&arr是整个数组的地址,&arr+1即跳过整个数组,但                                                                                     数组中仍然没有\0所以是 随机值
printf ( "%d\n" , strlen ( & arr [ 0 ] + 1 )); //arr[0]是首元素,&arr[0]是首元素的地址,&arr[0]+1是第二个元                                                            素的地址,所以是 5 个字节
char * p = "abcdef" ;
printf ( "%d\n" , sizeof ( p ));      //p是指针变量,存放的是首元素的地址,所以是 4/8 个字节
printf ( "%d\n" , sizeof ( p + 1 ));  //p+1表示第二个元素的地址,所以是 4/8 个字节
printf ( "%d\n" , sizeof ( * p ));     //*p即第一个元素,所以是 1 个字节
printf ( "%d\n" , sizeof ( p [ 0 ]));  //p[0]=*(p+0)=*p,也是第一个元素,所以是 1 个字节
printf ( "%d\n" , sizeof ( & p ));    //char* *pp=&p,是p的地址,所以是 4/8 个字节
printf ( "%d\n" , sizeof ( & p + 1 )); //&p+1还是地址,所以是 4/8 个字节
printf ( "%d\n" , sizeof ( & p [ 0 ] + 1 )); //p[0]是首元素,&p[0]是首元素地址&p[0]+1是第二个元素的地址,                                                   所以是 4/8 个字节
printf ( "%d\n" , strlen ( p ));        //p表示数组首元素地址,共6个字符类型元素,所以 6 是个字节
printf ( "%d\n" , strlen ( p + 1 ));    //p+1表示数组第二个元素地址,共5个字符类型元素,所以 5 是个字节
printf ( "%d\n" , strlen ( * p ));       //p是数组名表示数组首元素地址,*是p第一个元素即'a',a的                                                                  ASCII码值 97被 当成了地址,会非法访问,所以会报错, err
printf ( "%d\n" , strlen ( p [ 0 ]));    //p[0]=*(p+0)=*p,也是第一个元素,a的ASCII码值 97被 当成了地址,                                                    会非法访问,所以会报错, err
printf ( "%d\n" , strlen ( & p ));      //char* *pp=&p,是p的地址,是 随机值
printf ( "%d\n" , strlen ( & p + 1 )); //&p+1是p后面的地址,所以是 随机值
printf ( "%d\n" , strlen ( & p [ 0 ] + 1 )); //p[0]是首元素,&p[0]是首元素地址&p[0]+1是第二个元素的地址,                                                          所以是 5 个字节
// 二维数组
int a [ 3 ][ 4 ] = { 0 };
printf ( "%d\n" , sizeof ( a ));            //数组名单独放在sizeof内表示整个数组的地址,即4*3*4= 48 个字符
printf ( "%d\n" , sizeof ( a [ 0 ][ 0 ]));      //首元素, 4 个字节
printf ( "%d\n" , sizeof ( a [ 0 ]));          //在二维数组中a[0]代表第一行的数组名,数组名单独放在sizeof中                                                       代表整个数组的第一行所有,所以是4*4= 16 个字节
printf ( "%d\n" , sizeof ( a [ 0 ] + 1 ));    //a[0]作为第一行的数组名并非表示整个第一行这个数组时a[0]就是                                                第一行首元素的地址,a[0]+1,跳过一个int,是a[0][1]的地址 4/8 字节
printf ( "%d\n" , sizeof ( * ( a [ 0 ] + 1 ))); //a[0]+1==a[0][1]的地址,*(a[0]+1)即a[0][1],所以是 4 个字节
printf ( "%d\n" , sizeof ( a + 1 ));         / /a是二维数组的数组名,没单独放在sizeof内部,也没有&,所以                                                       a就是数组首元素的地址,二维数组在内存中是一行,所以我们                                                        把二维数组想象成一维数组,第一行就是首元素,a+1是第二行                                                          的地址,所以是 4/8 个字节
printf ( "%d\n" , sizeof ( * ( a + 1 )));      //a+是第二行的地址,*(a+1)就是第二行所有元素,所有是                                                                4*4= 16 个字节
printf ( "%d\n" , sizeof ( & a [ 0 ] + 1 ));  //&a[0]是第一行的地址,&a[0]+1就是第二行的地址,                                                                                sizeof(&a[0] + 1)计算的第二行地址大小,是 4/8 个字节
printf ( "%d\n" , sizeof ( * ( & a [ 0 ] + 1 ))); //&a[0]是第一行的地址,&a[0]+1就是第二行的地址,*(&a[0]+1)                                                              就是第二行所有元素,是4*4= 16 个字节
printf ( "%d\n" , sizeof ( * a ));              //a表示首元素的地址,就是第一行的地址。*a 拿到的就是第一行                                                              大小就是 16 个字节
printf ( "%d\n" , sizeof ( a [ 3 ]));          //a[3]是二维数组的第4行,虽然没有第四行,但是类型能够确定,                                                               是 16 个字节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值