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"};   //对结构体成员的引用,必须使用成员运算符"."

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个元素

typedef char * String;    //String p,定义String为字符类型指针

typedef int (*Pointer) ();    //声明Pointer为指向函数的指针类型

时间: 2024-08-03 14:09:16

C语言---数据结构(内建,数组,自定义)的相关文章

OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)

OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-while) 跳跃(discard, return, break, continue) 6.1函数定义   着色器是由一系列全局声明和函数定义组成的.函数声明规范如下: // prototype returnType functionName (type0 arg0, type1 arg1, ...,

数据结构(C语言第2版)-----数组,广义表,树,图

任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构. 之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的.下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一种数据结构. 认识数组和广义表 数组可以看成是一种特殊的线性表,也就是线性表中的数据元素本身也是一个线性表,数组中的个元素具有统一的类型.其实说白了就是在脑海中想数组中的数据如何在内存中以什么形式的线性表来存储.在C语言中,一个二维数组可以定义为其分量类型为一维数组类型的一维数组类型. 数组一旦被建

任务内建消息队列——OSTaskQ???()

一.知识背景 实际应用中,多个任务同时等待一个消息队列的情况很少见,也就是说OSQ???()用的并不多,因此,在uC/OS-III 中,每一个任务都有其内建的消息队列.用户可以通过外部消息队列直接发送消息给任务. 这个特性不仅简化了代码, 还提高了效率.如下示意图, uC/OS-III 中与任务消息队列相关的服务都是以 OSTask???()开头的.设置 OS_CFG.H 中的 OS_CFG_TASK_EN 使能任务的消息队列服务.与任务消息队列相关的代码在 OS_TASK.C 中. 当用户清楚

django 内建标签和过滤器参考

下面的标签和过滤器参考就是为那些没有 admin 站点的可用的人准备的.由于 Django 是高度可定制的,你的 admin 里的关于标签和过滤器的参考可以认为是最可信的. 内建标签参考 block 定义一个能被子模板覆盖的 块. 参阅 模板继承 了解更多信息 comment 注释.模板引擎会忽略掉 {% comment %} 和 {% endcomment %} 之间的所有内容. cycle 在循环时轮流使用给定的字符串列表中的值. 在一个循环中, 在循环过程中的每次循环里轮流使用给定的字符串

python基础-常用内建模块

一.collections:内建集合模块. 1.namedtuple:创建一个自定义的tuple对象 2.deque:为了高效实现插入和删除操作的双向列表,适合用于队列和栈 3.defaultdict:Key不存在时返回默认值 4.OrderedDict:保持Key的顺序 5.Counter:一个简单的计数器 二.base64 : 一种用64个字符来表示任意二进制数据的方法 三.struct : str和其他二进制数据类型的转换 四.hashlib : 提供常见的摘要算法,如MD5,SHA1 五

Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较

Lua这类脚本语言在处理业务逻辑作为配置文件的时候方便省事 但是在大量需要 运算的地方就显得略微不足   按照 Lua内建排序算法 对比C/C++ PHP Java等的快速排序算法进行一下比较. 快速排序算法是基于冒泡排序,优化而来,时间复杂度T(n)=O(nLog2n)  ,可见内部采用了二分策略 . 发现在LuaIDE LDT下直接运行效率要比 通过C++加载运行Lua脚本效率高的多  拿500W个数据排序 来说  ,脚本如下 同样的排序脚本Lua解释器的内置排序算法在LDT下,运行速度比通

C语言基础知识【数组】

2017年7月11日17:34:05C 数组1.C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量.数组的声明并不是声明一个个单独的变量,比如 number0.number1.....number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0].numbers[1].....numbers[99] 来代表一个个单独的变量.数组中的特定元素可以通过索引访问.所有的数组都是由连续的内

Python3 内建模块 datetime/collections/base64/struct

datetime 我们先看如何获取当前日期和时间: >>> from datetime import datetime >>> now = datetime.now() # 获取当前datetime >>> print(now) 2015-05-18 16:28:07.198690 >>> print(type(now)) <class 'datetime.datetime'> 注意到datetime是模块,datetim

跟王老师学注解(二)注解的分类及内建注解

跟王老师学注解(二):注解的分类及内建注解 主讲教师:王少华   QQ群号:483773664 一.注解的分类 在Java中,根据注解的使用方法和用途,可将注解分成3类,分别是 内建注解(也称为基本注解),定义于java.lang包下 元注解(Meta Annotation) 自定义注解 二.内建注解 (一)分类 在JDK5.0及以上的版本的java.lang包下提供了3种标准的注解类型,分别是 @Override: @Deprecated @SuppressWarnings (二)@Overr