如何在c程序中动态使用数组

  C语言不允许对数组的大小作动态定义,不能在程序中临时输入数组大小,这就给编程带来一定的困难。

  下面通过一个求平均数和标准差的小程序来展示如何在程序中动态定义数组大小:

 1 /*如何在c程序中动态使用数组(calloc函数)*/
 2 #include <stdio.h>
 3 #include <stdlib.h>                
 4 #include <math.h>
 5 int main(){
 6     int num;                                //数据个数
 7     double sum,ave,s2;                         //数据和、平均数、方差
 8     printf("请输入数据个数:");
 9     scanf("%d",&num) ;
10     double* array=(double*) calloc(num,sizeof(double)); //使用calloc函数申请数据数组的内存,然后用一个double指针接收(也可以使用malloc函数代替calloc)
11     printf("请输入数据:");
12     for(int i=0;i<num;i++){                   //这里便可以通过已知的数组长度进行数据输入
13         scanf("%lf",&array[i]);
14         sum+=array[i];
15     }
16
17     printf("平均数为:%lf",ave=sum/num);
18     for(int i=0;i<num;i++){
19         s2+=pow(array[i]-ave,2);
20     }
21     printf("标准差为:%lf",sqrt(s2));          //求标准差
22     free(array);                           //释放申请的内存
23     return 0;
24 } 

  重点在于第10行代码,要用到calloc函数: 它包含于stdlib.h头文件,需要给它提供两个参数:①对象个数:也就是要定义数组的大小;②对象长度:单位为字节,一般可以用sizeof(类型名)来求得。然后,calloc函数会将“数组首地址”返回,这时候我们一般需要对它进行强转成我们所需要的数组类型。

  在本程序中,要求一组未知个数的数据的平均值和标准差,首先定义int变量num,它是我们在程序中临时输入的数组长度,然后便可以调用calloc函数。由于我们需要的是double数组,还需要将calloc函数返回值强转,最后用一个double指针接收这个首地址,就可以将这个指针看作是“数组”了。接下来就可以随心所欲地对这个数组进行处理了。

  malloc函数与calloc类似,只不过它只需要一个参数:所需要地址总大小,这时我们可以通过将num*sizeof(double)传递给malloc函数了。调用malloc函数既可以使用stdlib.h也可以使用malloc.h。

时间: 2024-10-13 12:05:09

如何在c程序中动态使用数组的相关文章

【转】如何在 Android 程序中禁止屏幕旋转和重启Activity

原文网址:http://www.cnblogs.com/bluestorm/p/3665890.html 禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android:screenOrientation=”landscape” 属性. landscape = 横向portrait = 纵向 避免在转屏时重启Activity android中每次屏幕方向切换时

来篇文章:ASP。NET程序中动态修改web.config中的设置项目 (后台CS代码)

朋友们可以自行测试,我这里都没有问题了,鳖了一上午的问题总算解决了 using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; usi

在MVC应用程序中动态加载PartialView

有时候,我们不太想把PartialView直接Render在Html上,而是使用jQuery来动态加载,或是某一个事件来加载. 为了演示与做好这个练习,我们先在Views目录下的Home下创建_Partial1.cshtml部分视图,视图内容任你自定义,Insus.NET在本例中只让其显示一些文字与一张图片: 接下来,我们需要建立一个ActionResult()方法,在Controllers目录之下,打开HomeController.cs: 再去Views\Home目录,创建一个DynamicL

如何在url地址栏中直接写数组参数进行传递

今天博主遇到这样一个问题,就是如何在浏览器url地址栏中直接写入数组参数进行传递,问了身边几个同事,都没有找到成功的书写方法.就开始怀疑是否可以在地址栏中直接写入数组进行传递.开始在谷歌,百度进行搜索查询,也是同样没有找到有用的信息. 也许,大家很少遇到这样的情况. 就这样,我自己开始慢慢的尝试书写,将自己熟悉的几种方式全部都试了一遍,依然传递不对.最后在无意情况下,不小心将参数多复制了一个,点击回车,竟然传递成功了,还是数组结果.瞬间成就满满,虽然只是一个简单小应用. 特此,写一贴给广大博友分

如何在RCP程序中添加一个banner栏

前言:这段时间还算比较空闲,我准备把过去做过的有些形形色色,甚至有些奇怪的研究总结一下,也许刚好有人用的着也不一定,不枉为之抓耳挠腮的时光和浪费的电力.以前有个客户提出要在RCP程序中添加一个banner栏,研究了很久才搞定.代码是基于eclipse4.3.2的. 先看一下效果预览: 为了添加一个banner栏,我们必须重写RCP程序最外层的layout类,即TrimmedPartLayout.java.这个layout类是用来控制menu,toolbar等最基本的layout布局的.我们写一个

如何在程序中动态设置墙纸(使用IActiveDesktop接口)

大家都知道设置WINDOWS桌面墙纸的WIN32 API是SystemParametersInfo, 使用SPI_SETDESKWALLPAPER参数便能设置墙纸: ::SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\ABitmap.bmp", SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE); 但问题并没有解决,因为这个WIN32 API有很大的局限性 1. 无法把jpeg, gif等其他非位

微信小程序 setData动态设置数组中的数据

setdata传递动态数据值必须为对象(只能是key:value) 语法如下 this.setData({ filter: 1212 }) 如果setdata要传递数组呢? 首先相到的是 this.setData({ filter.a: 12 filter.b: 32 }) 这样回报语法错误 既然语法规定不能在里面写数组,那就把数组定义到外面 filter.selectArea1 = 1, filter.selectArea2 = 2, filter.selectArea3 = 3, this.

js的传值,table中tr的遍历,js中动态创建数组

1.这里关键是对页面中的传值,其次是动态的创建一个数组,用来存值 $(val).css("background-color", "rgb(251, 248, 233)");//取消选中var ary;if (crival_number.indexOf(fnumber) > 0) { var fnumbers = crival_number.split(",");//然后做的操作便是从crival_number中去掉相对应的numberary

如何在SOUI窗口中动态创建新的SWindow?

一些网友经常出现的一个问题就是我下面的代码为什么在SOUI的xxx窗口中没有动态创建了新窗口: SWindow *pWnd = new SWindow(); FindChildByName(L"xxx")->InsertChild(pWnd); 上面这样的代码有3个问题: 1.它并不会在界面中显示出来你new出来的子窗口.因为这个新插入的窗口没有指定布局属性. 2.这样做在程序退出时可能出现崩溃,因为内存分配和翻译可能不在相同的模块. 3.pWnd中的各种其它属性也没有被正常初始