【资料图】
C语言数组的定义及引用
数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。以下是小编分享给大家的C语言数组的定义及引用相关内容,希望大家喜欢!
C语言数组的定义及引用1
1.1 一维数组的定义、初始化和引用
1.一维数组的定义方式为:
类型说明符 数组名[常量表达式]
(1)数组名的命名方法与变量名相同,遵循标识符命名规则;
(2)数组是用方括号括起来的常量表达式,不能用圆括号;
(3)常量表达式表示数组元素的个数,即数组的长度,数组的下标从0开始,下标的最大值为:常量表达式-1;
(4)常量表达式中可以包括常量和符号常量,不能包括变量。
可以用赋值语句或输入语句使数组中的元素得到值,但要占用运行时间。可以使数组在运行之前初始化,即在编译阶段使之得到初值。
2.对数组初始化可以用以下方法实现:
(1)在定义数组时对数组元素赋以初值。如:
static int a[10]={0,1,2,3,4,5,6,7,8,9};
经过上面的定义和初始化后,a[0]=0,a[1]=1,…,a[9]=9。
(2)初始化时可以只对一部分元素赋初值。例如:
static int a[10]={0,1,2,3,4};
定义的数组有10个元素,但只对其中前5个元素赋了初值,后5个元素初值为0。
(3)如果想使一个数组的元素值全部为0,可以用下面的方法:
static int a[10]={0,0,0,0,0,0,0,0,0,0};
不能用:
static int a[10]={0*10};
如果对static型数组不赋初值,系统会对定义的所有数组元素自动赋以0值。
(4)在对全部数组元素赋初值时,可以不指定数组长度。
3.一维数组的引用方法是:
C语言规定不能一次引用整个数组,引用时只能逐个元素引用,数组元素的表示形式为:
数组名[下标]
下标可以是整型常量或整型表达式。如:
a[0]=a[5]+a[7]-a[2*3];
1.2 二维数组的定义、初始化和引用
1.二维数组定义的一般形式为
类型说明符数组名[常量表达式][常量表达式]
C语言采用上述定义方法,我们可以把二维数组看做是一种特殊的一维数组:它的元素又是一维数组。在C语言中,二维数组中元素的排列顺序是:先按行存放,再按列存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。
2.二维数组的初始化:二维数组可以用下面的方法初始化:
(1)分行给二维数组赋初值。如:
static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
以上赋值把第一个花括号内的数据赋给第一行元素,第二个花括号内数据赋给第二元素…,即按行赋值。
(2)可以将所有的数据写在一个花括号内,按数组排列的顺序对各元素赋值。
(3)可以对数组的部分元素赋初值。如:
static int a[3][4]={{1},{5},{9}};
以上赋值的结果是:数组第一列的元素分别赋了初值1,5,9,其余元素的值都是0。
(4)如果对二维数组的全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
3.二维数组的"引用:二维数组的元素可以表示为:
数组[下标][下标]
在引用二维数组时,必须是单个元素,不能是整个数组名。下标可以是一个表达式,但不能是变量。如果下标是一个表达式,注意表达式的值不能超出数组定义的上、下限。
C语言数组的定义及引用2
指针数组说明的一般形式为:
类型说明符 *数组名[数组长度]
其中类型说明符为指针值所指向的变量的类型。例如:
int *pa[3]
表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。
【例10-33】通常可用一个指针数组来指向一个二维数组。指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。
main(){
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0];
int i;
for(i=0;i<3;i++)
printf("%d,%d,%d ",a[i][2-i],*a[i],*(*(a+i)+i));
for(i=0;i<3;i++)
printf("%d,%d,%d ",*pa[i],p[i],*(p+i));
}
本例程序中,pa是一个指针数组,三个元素分别指向二维数组a的各行。然后用循环语句输出指定的数组元素。其中*a[i]表示i行0列元素值;*(*(a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由于p与a[0]相同,故p[i]表示0行i列的值;*(p+i)表示0行i列的值。读者可仔细领会元素值的各种不同的表示方法。
应该注意指针数组和二维数组指针变量的区别。这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的。
二维数组指针变量是单个的变量,其一般形式中"(*指针变量名)"两边的括号不可少。而指针数组类型表示的是多个指针(一组有序指针)在一般形式中"*指针数组名"两边不能有括号。例如:
int (*p)[3];
表示一个指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3。
int *p[3]
表示p是一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。
指针数组也常用来表示一组字符串,这时指针数组的每个元素被赋予一个字符串的首地址。指向字符串的指针数组的初始化更为简单。例如在例10.32中即采用指针数组来表示一组字符串。其初始化赋值为:
char *name[]={"Illagal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
完成这个初始化赋值之后,name[0]即指向字符串"Illegal day",name[1]指向"Monday"......。
指针数组也可以用作函数参数。
【例10-34】指针数组作指针型函数的参数。在本例主函数中,定义了一个指针数组name,并对name 作了初始化赋值。其每个元素都指向一个字符串。然后又以name作为实参调用指针型函数day_name,在调用时把数组名name赋予形参变量name,输入的整数i作为第二个实参赋予形参n。在day_ name函数中定义了两个指针变量pp1和pp2,pp1被赋予name[0]的值(即*name),pp2被赋予name[n]的值即*(name+ n)。由条件表达式决定返回pp1或pp2指针给主函数中的指针变量ps。最后输出i和ps的值。
main(){
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
char *ps;
int i;
char *day_name(char *name[],int n);
printf("input Day No: ");
scanf("%d",&i);
if(i<0) exit(1);
ps=day_name(name,i);
printf("Day No:%2d-->%s ",i,ps);
}
char *day_name(char *name[],int n){
char *pp1,*pp2;
pp1=*name;
pp2=*(name+n);
return((n<1||n>7)? pp1:pp2);
}
【例10-35】输入5个国名并按字母顺序排列后输出。现编程如下:
#include"string.h"
main(){
void sort(char *name[],int n);
void print(char *name[],int n);
static char *name[]={ "CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};
int n=5;
sort(name,n);
print(name,n);
}
void sort(char *name[],int n){
char *pt;
int i,j,k;
for(i=0;i<N-1;I++){< p>
k=i;
for(j=i+1;j<N;J++)< p>
if(strcmp(name[k],name[j])>0) k=j;
if(k!=i){
pt=name[i];
name[i]=name[k];
name[k]=pt;
}
}
}
void print(char *name[],int n){
int i;
for (i=0;i<N;I++) p printf(?%s ?,name[i]);<>
}
说明:
1) 在以前的例子中采用了普通的排序方法,逐个比较之后交换字符串的位置。交换字符串的物理位置是通过字符串复制函数完成的。反复的交换将使程序执行的速度很慢,同时由于各字符串(国名)的长度不同,又增加了存储管理的负担。用指针数组能很好地解决这些问题。把所有的字符串存放在一个数组中,把这些字符数组的首地址放在一个指针数组中,当需要交换两个字符串时,只须交换指针数组相应两元素的内容(地址)即可,而不必交换字符串本身。
2) 本程序定义了两个函数,一个名为sort完成排序,其形参为指针数组name,即为待排序的各字符串数组的指针。形参n为字符串的个数。另一个函数名为print,用于排序后字符串的输出,其形参与sort的形参相同。主函数main中,定义了指针数组name 并作了初始化赋值。然后分别调用sort函数和print函数完成排序和输出。值得说明的是在sort函数中,对两个字符串比较,采用了strcmp函数,strcmp函数允许参与比较的字符串以指针方式出现。name[k]和name[j]均为指针,因此是合法的。字符串比较后需要交换时,只交换指针数组元素的值,而不交换具体的字符串,这样将大大减少时间的开销,提高了运行效率。
C语言数组的定义及引用3
例子:输出一个 4×4 的整数矩阵,代码如下:
#include #include int main(){ int a1=20, a2=345, a3=700, a4=22; int b1=56720, b2=9999, b3=20098, b4=2; int c1=233, c2=205, c3=1, c4=6666; int d1=34, d2=0, d3=23, d4=23006783; printf("%-9d %-9d %-9d %-9d ", a1, a2, a3, a4); printf("%-9d %-9d %-9d %-9d ", b1, b2, b3, b4); printf("%-9d %-9d %-9d %-9d ", c1, c2, c3, c4); printf("%-9d %-9d %-9d %-9d ", d1, d2, d3, d4); system("pause"); return 0;}
运行结果:
20 345 700 22
56720 9999 20098 2
233 205 1 6666
34 0 23 23006783
矩阵共有 16 个整数,我们为每个整数定义了一个变量,也就是 16 个变量。那么,为了减少变量的数量,让开发更有效率,能不能为多个数据定义一个变量呢?比如,把每一行的整数放在一个变量里面,或者把 16 个整数全部都放在一个变量里面。
我们知道,要想把数据放入内存,必须先要分配内存空间。放入4个整数,就得分配4个int类型的内存空间:
int a[4];
这样,就在内存中分配了4个int类型的内存空间,共 4×4=16 个字节,并为它们起了一个名字,叫a。
我们把这样的一组数据的集合称为数组(Array),它所包含的每一个数据叫做数组元素(Element),所包含的数据的个数称为数组长度(Length),例如int a[4];就定义了一个长度为4的整型数组,名字是a。
数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为下标(Index)。使用数组元素时,指明下标即可,形式为:
arrayName[index]
arrayName 为数组名称,index 为下标。例如,a[0] 表示第0个元素,a[3] 表示第3个元素。
接下来我们就把第一行的4个整数放入数组:
a[0]=20;
a[1]=345;
a[2]=700;
a[3]=22;
这里的0、1、2、3就是数组下标,a[0]、a[1]、a[2]、a[3] 就是数组元素。
我们来总结一下数组的定义方式:
dataType arrayName[length];
dataType 为数据类型,arrayName 为数组名称,length 为数组长度。例如:
float m[12];
char ch[9];
需要注意的是:
1) 数组中每个元素的数据类型必须相同,对于int a[4];,每个元素都必须为 int。
2) 数组长度 length 最好是整数或者常量表达式,例如 10、20*4 等,这样在所有编译器下都能运行通过;如果 length 中包含了变量,例如 n、4*m 等,在某些编译器下就会报错,我们将在《C语言变长数组》一节专门讨论这点。
3) 访问数组元素时,下标的取值范围为 0 ≤ index < length,过大或过小都会越界,导致数组溢出,发生不可预测的情况,我们将在《C语言数组的静态性、越界以及溢出》一节重点讨论,请大家务必要引起注意。
4) 数组是一个整体,它的内存是连续的,下面是int a[4];的内存示意图:
数组的初始化
上面的代码是先定义数组再给数组赋值,我们也可以在定义数组的同时赋值:
int a[4] = {20, 345, 700, 22};
{ }中的值即为各元素的初值,各值之间用,间隔。
对数组赋初值需要注意以下几点:
1) 可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。例如:
int a[10]={12, 19, 22 , 993, 344};
表示只给 a[0]~a[4] 5个元素赋值,而后面5个元素自动赋0值。
当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 0:对于short、int、long,就是整数0;对于char,就是字符 "";对于float、double,就是小数0.0。
我们可以通过下面的形式将数组的所有元素初始化为 0:
int a[10] = {0};
char c[10] = {0};
float f[10] = {0};
由于剩余的元素会自动初始化为0,所以只需要给第0个元素赋0值即可。
示例:输出数组元素。
#include int main(){ int a[6] = {299, 34, 92, 100}; int b[6], i; //从控制台输入数据为每个元素赋值 for(i=0; i<6; i++){ scanf("%d", &b[i]); } //输出数组元素 for(i=0; i<6; i++){ printf("%d ", a[i]); } put" "); for(i=0; i<6; i++){ printf("%d ", b[i]); } put" "); return 0;}
运行结果:
90 100 33 22 568 10
299 34 92 100 0 0
90 100 33 22 568 10
2) 只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:
int a[10]={1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
而不能写为:
int a[10]=1;
3) 如给全部元素赋值,那么在数组定义时可以不给出数组的长度。例如:
int a[]={1,2,3,4,5};
等价于
int a[5]={1,2,3,4,5};
最后,我们借助数组来输出一个 4×4 的矩阵:
#include #include int main(){ int a[4] = {20, 345, 700, 22}; int b[4] = {56720, 9999, 20098, 2}; int c[4] = {233, 205, 1, 6666}; int d[4] = {34, 0, 23, 23006783}; printf("%-9d %-9d %-9d %-9d ", a[0], a[1], a[2], a[3]); printf("%-9d %-9d %-9d %-9d ", b[0], b[1], b[2], b[3]); printf("%-9d %-9d %-9d %-9d ", c[0], c[1], c[2], c[3]); printf("%-9d %-9d %-9d %-9d ", d[0], d[1], d[2], d[3]); system("pause"); return 0;}
关键词:
最新推荐
一年一度的京东618即将落下帷幕,你都下单了哪些产品?为给用户带来全
我们看到EDG俱乐部对此事不做任何解释,任由其发酵,然后转头就联系uzi
直播吧6月13日讯此前哈维曾公开称赞基米希,对此球员进行了回应。在被
对于皇马而言,一直都希望求购姆巴佩,而今年确实不是最好的时机,如果
目前莱万在巴萨的年薪是税后900万欧,此前西班牙媒体报道,沙特联赛希
关于工伤认定的时间,我国法律是有一定的规定的,尤其是职业病。根据《
工伤解除劳动关系时职业病患者工伤待遇的认定与处理申请工伤认定的有效
6月12日,恒而达(300946)融资买入171 88万元,融资偿还72 5万元,融
美联储仍是股市当面面临的最大风险。大摩指出,目前股市上涨并不意味着
1、是一个和尚或者尼姑写的说的意思是,对你给的爱情,只能还给你一钵
高考结束,志愿填报即将开始,如何查询准确的高校与专业信息?高考填志
“一顿火锅刚开宴,好戏连台惊四方!”丁晟导演的悬疑喜剧《没有一顿火
今日凌晨,据《队报》、天空体育、《电讯报》等多家媒体的消息,姆巴佩
这九人评选最强中单和TOP3,为此观众们进行了一系列的讨论,不同人有不
今天凌晨,来自队报的消息,姆巴佩团队已经通过书面的形式正式通知大巴
德班世乒赛结束后,乒乓球世界排名迎来了新的变化,中国队重新夺回五大
本报讯为切实加强缉枪治爆工作,近日,铁岭市公安局工人分局组织民警在
本报讯为切实维护营口市伏季休渔秩序,确保增殖放流取得实效,保障广大
统计数据显示,海南旅游市场旅游收入高于疫情前2019年同期水平,游客消
端午文案1)粽子飘香,佳人安康。(粽子 祝福)2)粽子是端午限定,你我是命中注定。(爱情 结婚)3)粽子之...
冬至佳句七绝·冬至一,枫叶红时信已传,梅心雪意亦如前。阳生莫问春何处,夜永应知又一年。二,夜阑风...
课文匆匆原文燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,...
本网讯近日,经宁夏回族自治区固原市农业系列职称评审委员会评审、市人
lucky的反义词是什么lucky的反义词是unlucky。lucky的意思以及用法:一、作为形容词1、幸运的,好运的一...
祝福考生考入理想大学,学上喜欢的专业!
在夏季,气温过高、湿度大、风速小等条件下,非常容易引发中暑。“热死
“迎接学青会健康新广西”广西新时代文明实践活动暨全民健身志愿服务活
日前,教育部公布第二批国家级一流本科课程名单,共有5750门课程获认定
近日,广西海洋环境监测中心站对平陆运河入海口(位于钦州茅尾海一带)
1、具体要看什么种类的车,不同种类的车报废年限不同。2、各类机动车使
近年来,随着人们健康意识的提高,各种膏药产品市场需求不断增长。在这样的市场背景下,仙佑医药膏药代...
时至今日,我觉得中国可以考虑对日本和韩国提出签订互不侵犯条约。其主
直播吧6月13日讯贝卢斯科尼因病离世,小罗社媒晒合照缅怀。小罗写道:
在《法兰克福汇报》的采访中,埃姆雷-詹对于错失冠军表示:“我依然还
直播吧6月13日讯此前哈维曾公开称赞基米希,对此球员进行了回应。在被
只是双打的大满贯冠军,但王欣瑜能够夺冠,同样是非常了不起的,这个小
今后的努力方向和改进措施1、针对员工提出的推荐,我采取的措施是:①合理安排工作,要放得下一些追求,...
依依惜别的诗句1、黄鹤楼送孟浩然之广陵 唐 李白故人西辞黄鹤楼,烟花三月下扬州。孤帆远影碧空尽,唯...
兰波的诗句1、唯一无法忍受即事事可忍受。——兰波2、你隐没在梦中,宛如雪化在火中。——兰波3、天才就...
岑参的边塞诗1、最动人的想家诗:《逢入京使》《逢入京使》故园东望路漫漫,双袖龙钟泪不干。马上相逢无...
近日,商务部发布《中国电子商务报告(2022)》,多彩贵州网旗下贵州电子
经商名言警句1、越是巨大的冒险,越是需要巨大的谨慎。2、如果注定要做一个商人,那么就要随时准备接受...
关于成长的诗歌《成长的方向》所有的河流都朝着东方不拒细流浩浩汤汤只是为了汇入大海汪洋所有的禾苗破...
哈姆雷特读书笔记一杯毒酒,一把毒剑。结局被鲜血浸染。哈姆雷特最终被众人抬放于高台,在沉重的葬礼进...
本报讯5月25日,甘肃省兰州市非公有制企业党委在兰州奔马集团举办针对
很多玩游戏的人都知道全民TV。我们看到上面很多直播,各种各样的都有。
我们知道支付宝有个天天领红包,微信从1月1日起到1月31日,每天在门店
火山直播是一款手机直播平台,主打网红娱乐生活直播。当然,我们在火山
京东上面怎么查看自己的年度账单呢,下面小编介绍一下。具体如下:1 打
当我们需要对图片进行一些调整时,可以使用ps工具。在ps中是否可以绘制
环球今头条!疯狂24小时!皇马计中计欺骗全欧,姆巴佩摊牌,1.2亿巨星恐被打压
全球新动态:曼城挖角国米中场全能神将,瓜帅情有独钟,两大障碍能否克服?
疯狂24小时!皇马计中计欺骗全欧,姆巴佩摊牌,1.2亿巨星恐被打压-最资讯
当前动态:GOAT德约斩获生涯第23座大满贯&3圈大满贯第一人
中网总奖金公布:1175万美元 ,同级别赛事奖金第一,其中WTA赛事803.97万美元 世界今热点
世界观点:中国金花夺冠+豪夺335万,德约科维奇收获1768万巨奖,23冠超纳达尔
短讯!孙颖莎惹争议!参加低级赛事,球迷质疑国乒吃相难看,帮忙抢积分
【新视野】多家上市公司进军新能源产业 跨界“奔赴”合理性引监管层关注
国内单机容量最大的冲击式水电机组完成国产化改造 成功并网发电 环球即时看
环球热消息:奥运积分排名更新!梁王暂居男双榜首,何冰娇高居女单第3
德约科维奇与穆雷同一日双双夺冠,球迷梦回四巨头时代,不见费纳!-全球最资讯
世界速读:沙特能源大臣:沙特想与中国合作,不会理会西方的“担忧”
海南发展(002163):6月12日北向资金增持25.24万股|环球要闻
热点聚焦:演员张龄心:不结婚不生子,老了就去养老院,如今她打了自己的脸_天天动态
中超之光!巴萨4000万清洗曼城天才,1600万签大连神锋,1年10球
世界时讯:皇马拒绝哈弗茨,迪巴拉拒绝沙特亿元高薪,穆里尼奥再收顶薪报价
皇马新7号确认!亿元先生接班阿扎尔挑战C罗,10号留给姆巴佩?|环球即时看
马琳难再指导陈梦,刘国梁布局,主教练放权,主管教练负责场边-世界速讯
【世界时快讯】陈梦丢大满贯有原因!官方杂志透露世乒赛前情况,一姐身体出问题
每日报道:降雨范围更大!13日起,广西将进入“龙舟水”集中期
体坛3大GOAT齐聚!梅西德约却只能在两边,詹姆斯丢冠却是居中C位
德天空记者:于帕梅卡诺在拜仁过得不开心,但无意在今夏离队_焦点快看
联系我们:55 16 53 8@qq.com
关于我们| 联系方式| 版权声明| 供稿服务| 友情链接
塞北网 版权所有,未经书面授权禁止使用
Copyright©2008-2020 By www.saibeinews.com All Rights Reserved