C语言---数据结构(内建,数组,自定义)
数组是一组有序数据的集合,每个元素都属于同一个数据类型。
一维数组的定义:
类型符 数组名[常量表达式]
常量表达式中,可以包括常量和符号常量,int a[3+5]是合法的。但是不能包含int a[n],C语言不允许动态数组。
子函数中是可以存在int a[2*n]的,但是不能是static局部变量,因为子函数中的数据在执行时,n已经确认,可以在
栈中分配出int n[2*n]的地址空间。
在定义时,初始化:
1) int a[10] = {0,1,2,...,9}; //使用{}l=括号
2) int a[10] = {0,1,2,3,4}; //部分赋值,未赋值的元素自动赋值0
3) int a[] ={1,2,3,4,5}; //可以不需要指定数组长度
一维数据的引用,数组名[下标]
二维数据定义:
类型符 数组名[常量表达式][常量表达式]
二维数组的引用 数组名[下标][下标]
二维数组的初始化
1) int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //每个行元素单独赋值
2) int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //所有元素写在一起赋值
3) int a[3][4] = {{1},{5},{9}}; //对每个行元素,都部分赋值
4) int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //C语言可自动推断出行元素个数
用来存放字符的数组,字符数组。其中的每个元素存放一个字符。最后自动加空字符'\0'
char [10];
字符数组的初始化,char c[10] = {'I',' ','a',....'y'}; //' '表示空格
C中的字符串是通过字符数组的形式来处理的,结束标志'\0',在ASCII中表示0。
可以通过字符串来对字符数组进行赋值。
char[] = "I am happy";
如果定义的字符数据长度比字符长,系统自动补'\0'
char c[10] = {"china"}; printf("%s",c); //输出只打印到第5个字符
C语言函数提供的字符串处理的函数。必须包含#include<string.h>
1) puts(字符数组);
char str[] = {"string"}; puts(str); //输出时将'\0'转换为\n,
2) gets(字符数组);
char str[10]; gets(str); //输入字符,自动加'\0'
puts和gets函数只能处理一个字符数组。
3) strcat(字符串1,字符串2);
char str1[30] = {""};
char str2[] = {"china"};
printf("%s", strcat(str1,str2)); //str1必须足够大,将str2链接到str1后
4) strcpy(字符数字1,字符串2);
char str1[10],str2[] = "china";
strcpy(str1,str2); //str1只能是数组名的形式,字符数组1必须定义的足够大,
//赋值时,只是将6个元素,放在str1的前6个单元(包括'\0'),之后的4个单元,仍是str1的字符。
strncpy(str1,str2,n); //将str2的前n个字符,copy到str1的前n个字符,不包括'\0'。‘’
//字符串之间不能直接用str1 = str2
5) strcmp(字符串1,字符串2);
strcmp(str1,str2); //比较str1和str2,直到出现不同的字符和'\0'为止。
//str1 == str2,则返回值0,str1 > str2, 则返回正整数,str1 < str2, 则返回负整数
//字符串之间不能直接用 str1 > str2
6) strlen(字符数组);
char str[10] = "China";
printf("%d", strlen(str)); //输出结果为5,表示实际的字符的个数,不包括'\0'
7) strlwr(字符串); //将字符串的大写转换为小写字母
8) strupr(字符串); //将字符串的小写转换为大写字母
用户自定义结构体类型:
struct 结构体名 {成员表列};
struct Student {int num; char name[20];} student1;
定义结构体变量:
结构体名 结构体变量
struct Student student1; //必须加struct来执行结构体类型名
也可以不指定类型名,直接指定结构体变量
struct {int num; char name[20];} student1;
1)在定义结构体变量时,初始化:
struct Student b = {.name = "zhang"}; //对结构体成员的引用,必须使用成员运算符"."
struct Student b = {name :"zhang”};
struct Student b = {"zhang"}
2)通过结构体变量名.成员名来引用结构体变量的成员
student1.num = 10010;
3)如果成员本身就是一个结构体,可以多次使用"."来引用:
student1.birthday.month
4)同类型的结构体变量可以相互赋值:
student1 = student2;
5)可以引用结构体变量的地址,也可以引用结构体变量成员的地址:
&student1.num &student1
结构体类型的指针,只能通过->来引用其中的成员变量
定义结构体数组:
结构体类型 数组名[数组长度]
struct Person leader[3];
定义结构体指针:
struct Student *pt; //如果p指向一个结构体变量stu,结构体变量.成员名(stu.num)
(*p).成员名((*p).num)
p->成员名(p->num)等价
指向结构体数组的指针
struct Student {int num; char name[];};
struct Student stu[3];
struct Student *p;
for(p=stu; p <stu +3; p++);
用结构体变量的数组或指针做函数参数
void input(struct Student stu[]);
共用体类型,同一段存储空间中,存储不同的数据结构,每次只能选择一种。
定义共用体变量:
union 共用体名 {成员表列} 变量表列;
union Data {int i; char ch; float f;} a,b,c;
引用共用体变量: a.i、a.ch、a.f
使用共用体类型数据时,同一内存段某一时间段内,只能用来存放一种数据结构
共用体中起作用的是最后一次被赋值的元素。
a.ch = 'a'; a.f = 1.5; a.i=40; //a中的值为40
共用体指针,也是通过.来引用其中的变量
如果一个变量的值只能是几种可能的值,可以定义为枚举(enum)类型
声明枚举类型: enum [枚举名] {枚举元素列表}
enum Weekend {sun, mon, tue, wed, thu, fri, sat};
声明枚举变量: 枚举类型名 变量名
enum Weekend workday;
C编译器对枚举元素是按常量来处理的。故称为枚举常量,所以不能对枚举变量进行赋值。
C语言按顺序,对他们进行赋值0,1,2,,,
printf("%d", workday); //输出相应的值
用typedef来重新声明类型。
typedef int integer;
typedef struct {int month; int day; int year;} Date; //声明一个新类型名Date
typedef int Num[100]; //声明Num为整型数组类型名 Num a; a为整型数组名,有100个元素
NUM n; n就是一个数组,含有100个元素
typedef char * String; //String p,定义String为字符类型指针
typedef int (*Pointer) (); //声明Pointer为指向函数的指针类型
结构体中允许嵌套:
1)结构体的自引用,结构体内部,包含指向自身类型的结构体指针;
2)结构体的相互引用,结构体内部,包含指向其他类型的结构体的指针;
需要注意:
1)结构体中可以嵌套其他结构体类型的变量,但是不能嵌套自己结构体类型的变量;
2)可以嵌套自己类型的结构体指针;
自我嵌套时:
struct tag1 {
struct tag1 A; //不可以嵌套自己类型的变量,这样在编译时,无法分配正确的空间
int value;
}
struct tag1 {
struct tag1 *A; //可以嵌套自己类型的变量指针,在编译时,只分配一个int类型的指针就可以
int value;
}
相互嵌套时:
typedef struct taga { //由于B类型声明在后边,所以此处不可以引用,需要先声明B类型的结构体
B *bp;
int value;
} A;
typedef struct tagb {
A *ap;
int value;
} B;
先声明结构体类型:
typedef struct taga A;
typedef struct tagb B;
struct taga {
B *bp;
int value;
}
struct tagb {
A *ap;
int value;
}
C语言---数据结构(内建,数组,自定义)的更多相关文章
- go语言的内建变量类型
string bool int int8 int16 int32 int64 uintptr 无符号int 类型 (u)int (u)int8 (u)int16 (u)int32 (u)int ...
- python 下的数据结构与算法---3:python内建数据结构的方法及其时间复杂度
目录 一:python内部数据类型分类 二:各数据结构 一:python内部数据类型分类 这里有个很重要的东西要先提醒注意一下:原子性数据类型和非原子性数据类型的区别 Python内部数据从某种形式上 ...
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- js面向对象自定义MyString()的构造器函数,实现内建String()属性和方法:
js面向对象自定义MyString()的构造器函数,实现内建String()属性和方法: var s = new MyString('hello'); s.length; s[0]; // " ...
- Go语言【第九篇】:Go数据结构之:数组
Go语言数组 Go语言提供了数组类型的数据结构.数组时具有相同唯一类型的一组已编号且长度固定的数据项序列,中类型可以是任意的原始类型如整形.字符串或者自定义类型. 相对于声明number0,numbe ...
- 在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性:
在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性: var s = new MyString("hello"); s ...
- AngularJS内建服务以及自定义服务的用法
在AngularJS中, 服务是一个比较重要的部分,它是一个对象或者是函数,可以在你的AngularJS的应用中使用.接下来介绍几种比较常用的内建服务以及自定义服务的方法. [内建服务] (1)loc ...
- js的内建arguments数组
调用函数时,只需在函数名后加一对用于传递参数的括号即可.var result = sum(1,2) 如果调用参数(a,b)的时候没有给值,则值默认为undefined.即使传递参数过多,多余的部分也会 ...
- Python中3种内建数据结构:列表、元组和字典
Python中3种内建数据结构:列表.元组和字典 Python中有3种内建的数据结构:列表.元组和字典.参考简明Python教程 1. 列表 list是处理一组有序项目的数据结构,即你可以在一个列表中 ...
随机推荐
- [skill] 补码
转载,写的很好!额,我的数学. 原文:https://www.douban.com/note/223507364/ 关于补码,看过一些书籍和网文,基本都是在“求反加一”的方法.步骤上反复强调,而对于补 ...
- airflow
基于airflow官方镜像制作自己的镜像,如给镜像安装pymongo FROM /common/air_grpc: MAINTAINER zhangchunyang@goldwind.com.cn U ...
- day4_函数简单介绍
一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...
- 《Linux 文本处理》- awk 分析 nginx 日志
废话不多说,简单了解一下 awk - 强大的文本分析工具,也就是分析日志 最常用的就是分析日志了吧,做统计什么,这里也拿 nginx 日志来做分析 1:统计出现次数 - 比如状态码出现次数 - 先直接 ...
- awk数组
对于awk '!a[$3]++',需要了解3个知识点 1.awk数组知识,不说了2.awk的基本命令格式 awk 'pattern{action}' 省略action时,默认action是{print ...
- SC-FDM和OFDM的区别
3GPP定义的LTE空中接口,在下行采用正交频分多址(OFDMA)技术,在上行采用的就是这个单载频频分多址(SC-FDMA)技术. SC-FDMA(Single-carrier Frequency-D ...
- MongoDB limit 选取 skip跳过 sort排序 方法
MongoDB limit 选取 skip跳过 sort排序 在mysql里有order by MongoDB用sort代替order by > db.user.find() { " ...
- Laravel编辑产品-CRUD之edit和update
上一篇讲了Laravel展示产品-CRUD之show,现在我们说一下Laravel编辑产品,涉及到编辑和更新, 1,定义controller,update和create有点相似,我们复制一份过来修改. ...
- mac上Android反编译工具apktool、dex2jar入门
MAC上Apktool的安装 官网链接 image.png 使用步骤如图1-6 第一:下载一个shell脚本,保存的名字就是”apktool”,不要带.sh后缀.可以复制到sublimetext, ...
- dbdeployer 快速安装MySQL8.0各测试环境
Linux系统必须安装有Go语言: 下载最新的包:https://github.com/datacharmer/dbdeployer/releases 解压: tar -xzf dbdepl ...