C语言学习总结(三) 复杂类型
第五章、复杂数据类型
(数组、字符串、指针、结构体、枚举、共同体)
1.什么是数组?
概念:把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组;
按数组元素的类型不同,数组又可分为:
- 数值数组:用来存储数值得
- 字符数组:用来存储字符 ‘a’
- 指针数组:用来存放指针(地址)的
- 结构数组:用来存放一个结构体类型的数据
按维度分类:
- 一维数组
- 二维数组
- 多维数组
1.一维数组
概念:所有的元素都不是数组
使用流程:定义数组---->给数组初始化---->使用数组
定义:
数据类型 数组名[长度] ;
//int a[7];
1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
2)第一个数组元素的地址是数组所占内存块的地址。
3) 数组名的书写规则应符合标识符的书写规定,命名不能相同。
4) 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始 计算。因此5个元素分别为a[0], a[1], a[2], a[3], a[4]
5) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。
6)定义数组不初始化存的是垃圾数,一旦有元素初始化,其他元素都赋值为0;
初始化:
定义:数据类型 数组名[长度]={元素1,元素2,…};
特点:
1)指定元素的个数的同时,对所有的元素进行显式的初始化
int nums[5] = {1,2,3,4,5};
2)指定数组的元素个数,对数组进行部分显式初始化 定义的同时对数组进行初始化,没有显式初始化的元素,那么系统会自动将其初始化为0
int nums[10] = {1,2};
3)不指定元素个数,定义的同时初始化,它是根据大括号中的元素的个数来确定数组的元素个数
int nums[] = {1,2,3,5,6};
4)指定元素个数,同时给指定元素进行初始化
int nums[5] = {[4] = 3,[1] = 2};
5)单个赋值:
数组名[角标]=值;
注意:一个长度为n的数组,最大下标为n-1;超过范围视为越界,会发生未知错误;
引用:
在C语言中只能逐个使用下标变量,而不能一次引用整个数组。
数组名[下标]
数组的遍历:通过循环访问数组的每一个元素。
int a[]={,,,,,,,,};
//正序输出
for(int i=;i<;i++){
printf("%d\t",a[i]);
}
//逆序输出
for(int i=;i>;i--){
printf("%d\t",a[i]);
}
存储方式:
假设有数组如下:
int x[]={1,2};
char ca[5]={‘a’,‘A’,‘B’,‘C’,‘D’};
注意:
- 计算机会给数组分配一块连续的存储空间
- 数组名代表数组的首地址,从首地址位置,依次存入数组的第1个、第2个....、第n个元素
- 每个元素占用相同的字节数(取决于数组类型)
- 并且数组中元素之间的地址是连续。

注意:字符在内存中是以对应ASCII值的二进制形式存储的,而非上表的形式。
地址:
连续的!

注意:在内存中,内存从大到小进行寻址,为数组分配了存储空间后,数组的元素自然的从上往下排列 存储,整个数组的地址为首元素的地址。
数组的长度计算:
数组的长度=数组的总字节数 / 数组的单个字节数
//count=sizeof(arr[10]) / sizeof(int)
五,有什么特点?
- 1.数组必须要定义长度(正整数),定义时可初始化(长度必须是常量)或之后单独初始化.
- 2.数组是有序的.每个数据都有角标.从0开始分配.角标不能>=数组长度.类型一致.
- 3.数组有地址(数组名),里面的元素也有地址.数组当参数时(长度可省)传递的是地址.
- 4.数组当参数传递时是指针类型.所以如果需要用数组长度要额外传递.
应用:
使用选择排序实现一组数字的排序--大>>小
中心思想:把数组第一个元素的的角标设为最大值,于后面的数字相比较.找出最大值的角标,然后与第一个元素进行调换;找出一个最大值,同理循环 !!选择是把最大的一个数字一到最前面,所以y=x+..(确定最前面的数字)
#include<stdio.h>
int main()
{
int arr[]={,,,,,,,};
int maxzb=;
for (int x=;x<; x++) {
maxzb=x;//....?? for (int y=x+; y<;y++) { //y每次的循环初值!!!!!
if(arr[maxzb]<arr[y]){
maxzb=y;
}
}
printf("第%d次排序最大角标:%d\n",x,maxzb);
int temp=;
temp=arr[x];
arr[x]=arr[maxzb];
arr[maxzb]=temp;
for (int s=; s<; s++){ printf("%d\t",arr[s]);}//输出的是s.不是maxzb!!!
}
return ;
}
选择排序
冒泡排序....最大数字移动最后,所以b=0每次从第一个开始.(确定最后一个数)
#include<stdio.h>
int main()
{
int arr[]={,,,,,,,,,};
for (int a=; a<; a++) {
for (int b=; b<-a; b++) {
if (arr[b]<arr[b+]) {
int temp=arr[b];
arr[b]=arr[b+];
arr[b+]=temp;
}
}
//printf("\n");
}
for (int c=; c<; c++) {
printf("%d\t",arr[c]);
} return ;
}
冒泡排序
数组用作函数参数有两种形式:
- 一种是把数组元素(下标变量)作为实参使用;
- 一种是把数组名作为函数;
1.数组元素就是下标变量,跟普通变量并无区别;

案例:
判别一个整数数组中各元素的值,若大于0 则输出该值,若小于 等于0则输出0值
void nzp(int v){
if(v>)
printf("%d ",v);
else
printf("%d ",); }
int main( ){
int a[],i;
printf("input 5 numbers\n");
for(i=;i<;i++){
scanf("%d",&a[i]);
nzp(a[i]);
}
return ;
}
2.数组名作为函数参数
原理:
当数组名作函数参数时,实参与形参之间不是"值传递",而是"地址传递",所以传递时
实参数组名将该数组的起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。

案例:
数组a中存放了一个学生5门课程的成绩,求平均成绩。
float avg(float a[],int len){
//定义一个变量用于累加数组中元素的值
float sum=0.0f;
//循环累加
for (int i=; i<len; i++) {
sum+=a[i];
}
//返回平均成绩
return sum/len;
}
int main(int argc, const char * argv[]) {
//定义数组
float score[]={59.5f,60.0f,88.5f,91.0f,100.0f};
//获得数组长度
int len = sizeof(score)/sizeof(float);
//获得平均值
float av = avg(score,len);
printf("平均值:%.2f\n",av);
return ;
}
注意:
- 形参和相对应的实参都必须是类型相同的数组,否则会引起错误;
- 由于传递的是数组的首地址,所以要把数组长度传递进去;
- 形参可以不给出长度,或用变量表示个数:void nzp(int a[]) / void nzp( int a[], int n )
- 多维数组也可以作为函数的参数。在函数定义时对形参数组可以指定每一维的长度,也可省去 第一维的长度。因此,以下写法都是合法的:int MA(int a[3][10]) / int MA(int a[][10])
2.什么是二位数组?
概念:
是用来存储一组数组的容器,用于把同一类型的一组数组统一管理起来.数组是一种构造类型的数据。
二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的 每个元素都又是一个数组,就组成了二维数组。
当然,前
C语言学习总结(三) 复杂类型的更多相关文章
- Go语言学习笔记三: 常量
Go语言学习笔记三: 常量 定义常量 常量就是在声明后不能再修改的量. const x int = 100 const y string = "abc" const z = &qu ...
- Go语言学习(四)经常使用类型介绍
1.布尔类型 var v1 bool v1 = true; v2 := (1==2) // v2也会被推导为bool类型 2.整型 类 型 长度(字节) 值 范 围 int8 1 128 ~ 12 ...
- 【原创】go语言学习(三)字符串串、时间和日期类型
目录 1.字符串串原理理解析2. 时间类型3. 日期类型 字符串串原理理解析 1.字符串串底层就是⼀一个byte数组,所以可以和[]byte类型互相转换2.字符串串之中的字符是不不能修改的,那怎么修改 ...
- C 语言学习 第三次作业总结
本次作业内容: For循环的使用 If判断语句的使用 常用数学运算表达式的使用 数学函数库中几个常见函数的使用及自我实现 将操作代码提交到coding 作业总结: For循环是C语言中一种基本的循环语 ...
- 【GO】GO语言学习笔记三
7.数组: 几乎是最常用的数据类型了... 数组就是指一系列同一类型数据 的集合.数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数 组的长度. 常规的数组声明方法: ...
- [读书笔记]C#学习笔记三: C#类型详解..
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
- Swift学习(三)类型推导&基本运算&分支&循环
一.Swift中类型推导&基本运算 Swift中类型推导 如果一个标识符在定义时有直接赋值,那么可以根据后面赋值的类型,来推导出前面标识符的类型,这样前面标识符的(:类型)可以省略 查看标识符 ...
- Go语言学习笔记(三) [控制结构、内建函数]
日期:2014年7月21日 一.控制结构 1.Go中,只有几个控制结构,它没有do或者while循环,有for,灵活的switch语句和if,在switch中可以接受像for那样可选的初始化语 ...
- R语言学习 第三篇:数据框
数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同.数据框的每列 ...
随机推荐
- Run-Time Check Failure #2 - Stack around the variable 'ucPriKey' was corrupt
Run-Time Check Failure #2 一般是栈被破坏,你的代码可能有缓冲区溢出一类的问题. Run-Time Check Failure #2 - Sta ...
- [rxjs] Async, handle data over time
If I have an array, and I want to apply filter, map, forEach to it. let Observable = Rx.Observable; ...
- [Java Performance] 数据库性能最佳实践 - JPA和读写优化
数据库性能最佳实践 当应用须要连接数据库时.那么应用的性能就可能收到数据库性能的影响. 比方当数据库的I/O能力存在限制,或者因缺失了索引而导致运行的SQL语句须要对整张表进行遍历.对于这些问题.只相 ...
- linux根下目录详解及分区建议
/ 根目录 分区大小一定要充足,一般不小于5GB/bin,/usr/bin 普通用户使用命令 建议和/放一起/sbin,/usr/sbin 管理员使用命令/bin,/sbin 操作系统自身 ...
- ArcGIS 设置地图显示范围大小
Arcmap的FullExtent默认是地图加载的时候的extent.其实这个fullExtent是可以设置的. 打开ArcMap,选择左边图例的Layers ,右键点击,选择“Properties. ...
- asp.net各种获取客户端ip方法
Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真 ...
- [Mime] MimeEntity--MimeEntity Mime实体帮助类 (转载)
点击下载 MimeEntity.rar 这个类是关于Mime实体的类看下面代码吧 /// <summary> /// 类说明:Assistant /// 编 码 人:苏飞 /// 联系方式 ...
- mysql的账户失效,之前的密码无法登录
引用自:http://blog.sina.com.cn/s/blog_682c287b0100ofz8.html 此为linux服务器下的做法 方法一: 1.关闭mysql # service ...
- Struts2多文件上传
第一步:首先创建一个多文件上传的页面 <html> <head> <meta http-equiv="Content-Type" content=&q ...
- OC - 18.监听iPhone的网络状态
使用系统的方法来监听网络状态 系统的方法是通过通知机制来实现网络状态的监听 实现网络状态监听的步骤 定义Reachability类型的成员变量来保存网络的状态 @property (nonatomic ...