五大板块(1)—— 数组的定义,赋值与应用

参考:五大板块(1)—— 数组的定义,赋值与应用
作者:丶PURSUING
发布时间: 2021-03-18 16:00:05
网址:https://blog.csdn.net/weixin_44742824/article/details/114981166

目录

  • 数组的定义及访问
    • 完全初始化,部分初始化,不初始化
    • 关于数组赋值,还需要注意:
      • Ⅰ、大多情况下,数组在定义时必须确定大小
      • Ⅱ 、数组的定义在下面三种情况下不需要指明大小
      • Ⅲ、也不能直接给数组赋值字符串
  • 数组的简单应用
    • 1到100的和(数组的赋值)
    • 比较5个数的大小(数组的遍历)
    • 数组作为子函数的形式参数以及数组元素个数计算

数组的定义及访问

完全初始化,部分初始化,不初始化

#include <stdio.h>
#include <string.h>int main()
{int i;//不初始化int array1[10];//完全初始化int array2[5]={1,2,3,4,5};//部分初始化int array3[5]={0};for(i=0;i<10;i++){printf("%d ",array1[i]);}putchar('\n');for(i=0;i<5;i++){printf("%d ",array2[i]);}putchar('\n');for(i=0;i<5;i++){printf("%d ",array3[i]);}putchar('\n');return 0;
}

运行结果:
可以看到不初始化的时候值是随机分配的,不建议采用这种方式。

1996072264 1 0 1995852616 67032 66992 0 66376 0 0 
1 2 3 4 5 
0 0 0 0 0 
  • 1
  • 2
  • 3

应该采用部分初始化,初始化第一个元素,其他元素的值默认为0

注意:
数组只有在定义的时候[ ]表示个数,其他时候都是下标。
数组的下标是从0开始,即数组的第一个元素是a[0]
数组的最后一个元素是a[i-1]

关于数组赋值,还需要注意:

Ⅰ、大多情况下,数组在定义时必须确定大小

例如类似下面的情景,数组定义时大小是不确定的,妄图通过后续改变的num进行动态赋值,这样的操作往往出现段错误

#include <stdio.h>int main()
{int num;int i;int array[num];printf("需要录入的学生人数?\n");scanf("%d",&num);//int array[num];for(i=0;i<num;i++){printf("请输入第%d个学生的成绩\n",i+1);scanf("%d",&array[i]);}printf("这些学生的成绩是:");for(i=0;i<num;i++){printf("%d ",array[i]);}return 0;
}

结果:

Segmentation fault
  • 1

是因为只有数组在定义的时候确定了大小,程序才能根据这个大小分配一段连续的内存空间给数组存放数据。

下面为探索过程-----------------👇

哎,我头铁,我就硬是要这样动态赋值!

  • 会不会是一开始num的值不确定导致的呢?做出如下更改
//int num;
int num = 0;
  • 1
  • 2

结果是没有了段错误,但我选择输入5个学生的成绩,然而输入2或者3个就停下了,这样也不行。如下图:
在这里插入图片描述

  • 那我把数组的定义往下移动,放在scanf后面,等num的值确定了我再定义数组总该可以吧?好想法!
scanf("%d",&num);
int array[num];
  • 1
  • 2

这样程序的执行虽无问题,但却是一个不好的习惯。

C语言变量的定义最好要放在开头,否则有时候编译器会报错的 ,就是要先定义完变量,再做其他事。(是的,但这通常是发生在写32,51上,Keil的C51所采用的C标准是一个较早期的标准,在程序书写上有较多的限制。)

而在gcc编译器中变量的定义却可以放在程序任何位置。

上面为探索过程-----------------👆

那可咋办呀?我好想进行动态赋值啊。在录入成绩之前用户可以选择录入几个人,而不是在程序中写死,不香吗??

有啊,别用数组了,用指针呗

#include <stdlib.h>
#include <string.h>int main()
{int num;int i;int *parray = NULL;//防止野指针printf("需要录入的学生人数?\n");scanf("%d",&num);//      游标卡尺    开辟空间大小parray = (int *)malloc(sizeof(int) * num);//开辟空间 字节为单位 malloc前相当于游标卡尺memset(parray,0,sizeof(int) * num);//空间初始化for(i=0;i<num;i++){printf("请输入第%d个学生的成绩\n",i+1);scanf("%d",parray++);}printf("这些学生的成绩是:");parray -= num;//指针回调,少了这个输出都是0for(i=0;i<num;i++){printf("%d ",*parray++);}return 0;
}

parray++的时候指针已经到达所指向地址空间边界,要parray -= num回调才能读到里面的值。
在这里插入图片描述

结果:

zhu@ubuntu:~/Desktop$ ./a.out 
需要录入的学生人数?
6
请输入第1个学生的成绩
65
请输入第2个学生的成绩
76
请输入第3个学生的成绩
54
请输入第4个学生的成绩
76
请输入第5个学生的成绩
87
请输入第6个学生的成绩
65
这些学生的成绩是:65 76 54 76 87 65

Ⅱ 、数组的定义在下面三种情况下不需要指明大小

①数组是形式参数

正是下文中数组的简单应用第3个例子

②数组声明的同时进行了初始化

int a[] = {0,1,2,3};
  • 1

根据实际情况,自动分配大小

③数组的存储类型为extern

嘿嘿,目前还没用过,用了来更新。

Ⅲ、也不能直接给数组赋值字符串

这个在下文中结构体的三种定义赋值方法也有涉及,这个情况也多见于结构体。

大致是这样

#include <stdio.h>int main()
{char array[128] = {0};array = "clc mei wo shuai";printf("%s\n",array);return 0;
}

或者这样(这是可以的,前作者有误)

#include <stdio.h>int main()
{char array[128] = "clc mei wo shuai";//array = "clc mei wo shuai";printf("%s\n",array);return 0;
}

都会提示错误:对具有数组类型的表达式赋值

error: assignment to expression with array type
  • 1

用strcpy函数

#include <stdio.h>
#include <string.h>int main()
{char array[128] = {0};strcpy(array,"clc mei wo shuai");printf("%s\n",array);return 0;
}

成功:

clc mei wo shuai
  • 1

数组的简单应用

1到100的和(数组的赋值)

#include <stdio.h>int main()
{int i;int sum;int array[100];for(i=1;i<=100;i++){array[i-1]=i;}for(i=0;i<=99;i++){sum+=array[i];}printf("sum=%d\n",sum);return 0;
}

比较5个数的大小(数组的遍历)

#include <stdio.h>int main()
{int array[5];int max,min;int i;for(i=0;i<5;i++){printf("请输入%d个数\n",i+1);scanf("%d",&array[i]);}max=array[0];min=array[0];for(i=0;i<5;i++){if(max < array[i]){max = array[i];}if(min > array[i]){min = array[i];}}printf("max=%d,min=%d\n",max,min);return 0;
}

数组作为子函数的形式参数以及数组元素个数计算

#include <stdio.h>int arraySum(int array[],int num)//数组形参,仅仅传递数组的首地址,代表不了个数。  数组内空间连续
{int sum;int i;for(i=0;i<num;i++){sum+=array[i];}return sum;
}int main()
{int sum;int array[5]={0,1,2,3,4};//      sum=arraySum(array,sizeof(array)/sizeof(array[0]));    //传递数组名sum=arraySum(&array[0],sizeof(array)/sizeof(array[0]));//或者传递首元素的地址(&)//sizeof里面只能传入数组名                                                  printf("sum=%d\n",sum);return 0;
}

①数组形参,仅仅传递数组的首地址,代表不了个数(所以个数不必写出)。
②传入数组有两种方式:传入数组首个元素的地址(&) / 数组名
③而用 sizeof 计算数组大小只能传入数组名
④计算数组个数:数组大小 / 数组中某个元素的大小(sizeof(array)/sizeof(array[0]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五大板块(2)—— 指针

参考&#xff1a;五大板块&#xff08;2&#xff09;—— 指针 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-18 16:01:22 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114981482 本文为学习笔记&#xff0c;整合课程内容及文章如下&…

台式计算机机箱都一样吗,别以为组装台式机很简单,机箱选择大有学问

原标题&#xff1a;别以为组装台式机很简单&#xff0c;机箱选择大有学问曾经组装台式机的时候对于机箱完全没有在意&#xff0c;总觉得随便选择一款就可以了&#xff0c; 而且是挑便宜的选择&#xff0c;而那些机箱有便宜也有贵&#xff0c;其实里面的设计完全不一样&#xff…

实现连麦_微信年底放了个大招,视频号重磅升级,打赏直播连麦美颜抽奖齐上...

期待已久的视频号连麦功能来了。这次来的不仅有连麦功能&#xff0c;还有视频号打赏的微信豆体系&#xff0c;创作者想要的入口也有了。让我们一起来看看有什么新功能吧&#xff01;太长不看版本&#xff1a;「附近的人」变「附近的直播和人」连麦上线&#xff0c;还有美颜、抽…

【转】 .NET 打印水晶报表(CrystalReport)时,出现“查询引擎错误 C:/DO...

2019独角兽企业重金招聘Python工程师标准>>> 本地开发环境&#xff1a; Win XP, Visual Studio 2003 Oracle 项目背景&#xff1a; WinForm 工程&#xff0c;在一个表单中用Treeview控件显示 部门层级信息&#xff0c;然后有 按照相同格式&#xff08;layout…

html5 查看图片,html5实现图片预览和查看原图

一、页面元素只有三个简单元素&#xff1a;拖拽区域二、添加简单的样式&#xff1a;.dragarea{width:300px;height:100px;background:#ddd;text-align:center;line-height:100px;}.drag_hover{background:rgba(0,0,0,.4) !important;}.item{width:300px;height:100px;float:lef…

五大板块(4)——链表

参考&#xff1a;五大板块&#xff08;4&#xff09;——链表 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-02-15 09:33:29 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114981905 目录一、对比链表与数组同样是存放一串数据&#xff0…

boolean类型默认值_「软帝学院」Java的基本数据类型

Java的基本数据类型Java的两大数据类型: 内置数据类型 引用数据类型内置数据类型Java语言提供了八种基本类型。六种数字类型(四个整数型&#xff0c;两个浮点型)&#xff0c;一种字符类型&#xff0c;还有一种布尔型。byte&#xff1a; byte数据类型是8位、有符号的&#xff0c…

五大板块(5)——字符串

参考&#xff1a;五大板块&#xff08;5&#xff09;——字符串 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-18 16:03:48 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114982019 目录一、字符串的定义方式与输出二、字符串的结尾是…

哈尔滨阳光计算机学院是不是黄了,黑龙江这4所野鸡大学,常被误认为是名校,实则害人不浅...

在高考中拿到高分进入心仪的大学&#xff0c;几乎是所有高三党奋斗努力的目标。但并不是所有的考生都能得偿所愿&#xff0c;没有取得高分&#xff0c;想进入好大学&#xff0c;但是又不想复读再经历一次高三的磨砺。如果此时你收到了录取通知书或者电话&#xff0c;告知你被一…

android 打开支付宝扫码页_Chrome 85正式版发布:新增标签页分组功,网页多了也不乱...

IT服务圈儿有温度、有态度的IT自媒体平台文章转载自 OSCHINA 社区[http://www.oschina.net]原文标题&#xff1a;Chrome 85 稳定版发布&#xff0c;页面加载速度提升 10%谷歌今日发布了最新稳定版 Chrome 85。此版本将页面加载速度提高了 10%&#xff0c;并带来了许多标签页方面…

Windows使用技巧

摘自&#xff1a;这些技巧让你windows用起来很爽 —— 小工具&#xff0c;小技巧&#xff0c;删小广告&#xff0c;重装卸载残留 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-12 16:09:17 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/detail…

iOS开发缓存机制之—内存缓存机制

在IOS应用程序开发中&#xff0c;为了减少与服务端的交互次数&#xff0c;加快用户的响应速度&#xff0c;一般都会在iOS设备中加一个缓存的机制。这篇文章将介绍一下如何在iOS设备中进行缓存&#xff0c;本文先介绍一下将内容缓存到内存中&#xff0c;下一篇文章就介绍一下在i…

云计算机教室怎么布线,云和县实验小学计算机教室综合布线及计算机安装预算方案.doc...

云和县实验小学计算机教室综合布线及计算机安装预算方案.doc (2页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;17.90 积分&#xfeff;云和县教育装备和勤工俭学办公室计算机教室改造工程参数设备名…

循环造数据_项目管理数据与信息--DIKW模型

开头的话在PMP中&#xff0c;有一块内容是“项目管理数据与信息&#xff1a;工作绩效数据&#xff08;Work Performance Data&#xff09;&#xff0c;工作绩效信息&#xff08;Work Performance Information&#xff09;&#xff0c;工作绩效报告&#xff08;Work Performance…

基于C语言Ncurse库和链表的简单贪吃蛇小游戏

参考&#xff1a;基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者&#xff1a;三速何时sub20 发布时间&#xff1a;2020-09-29 10:23:51 网址&#xff1a;https://blog.csdn.net/weixin_44234294/article/details/108829135?spm1001.2014.3001.5501 Ncurses库相关介绍 ncurse…

C 内存分配【转】

c 内存分配 1、程序代码区:存放函数体的二进制代码。 2、全局区数据区&#xff1a;全局数据区划分为三个区域。 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域&#xff0c;未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。常量数…

STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结

摘自&#xff1a;STM32F103五分钟入门系列&#xff08;一&#xff09;跑马灯&#xff08;库函数寄存器&#xff09;加编程模板GPIO总结 作者&#xff1a;自信且爱笑‘ 发布时间&#xff1a; 2021-04-28 21:17:40 网址&#xff1a;https://blog.csdn.net/Curnane0_0/article/det…

计算机没有程序,计算机小知识:想尝试写程序却没有电脑?这个在线编辑器满足你...

大家好&#xff0c;我是零一&#xff0c;昨天的文章《计算机小知识&#xff1a;手把手教你写出自己的第一个程序&#xff1a;Hello World》发表后&#xff0c;没几分钟就有小伙伴问我&#xff0c;没有电脑&#xff0c;但是真的很想尝试去学习一下编程&#xff0c;应该怎么办&am…

微信小程序时间戳的转换及调用

13位 的时间戳&#xff0c;如下图&#xff1a; 效果图: 1.(utils.js里面的代码): function formatTime(timestamp, format) {const formateArr [Y, M, D, h, m, s];let returnArr [];let date new Date(timestamp); //13位的时间戳, 如果不是13位的, 就要乘1000,就像这样…

基于Wemos D1的感应开盖垃圾桶

参考&#xff1a;基于Wemos D1的感应开盖垃圾桶&#xff08;增加自己的代码实现部分&#xff09; 作者&#xff1a;LEO-max 发布时间&#xff1a;2020-12-29 15:21:26 网址&#xff1a;https://blog.csdn.net/zouchengzhi1021/article/details/111880104?spm1001.2014.3001.55…