数组是一组有序数据的集合,每个元素都属于同一个数据类型。

一维数组的定义:

类型符  数组名[常量表达式]

常量表达式中,可以包括常量和符号常量,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语言---数据结构(内建,数组,自定义)的更多相关文章

  1. go语言的内建变量类型

    string bool int int8  int16 int32 int64 uintptr   无符号int 类型  (u)int (u)int8 (u)int16 (u)int32 (u)int ...

  2. python 下的数据结构与算法---3:python内建数据结构的方法及其时间复杂度

    目录 一:python内部数据类型分类 二:各数据结构 一:python内部数据类型分类 这里有个很重要的东西要先提醒注意一下:原子性数据类型和非原子性数据类型的区别 Python内部数据从某种形式上 ...

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

    OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...

  4. js面向对象自定义MyString()的构造器函数,实现内建String()属性和方法:

    js面向对象自定义MyString()的构造器函数,实现内建String()属性和方法: var s = new MyString('hello'); s.length; s[0]; // " ...

  5. Go语言【第九篇】:Go数据结构之:数组

    Go语言数组 Go语言提供了数组类型的数据结构.数组时具有相同唯一类型的一组已编号且长度固定的数据项序列,中类型可以是任意的原始类型如整形.字符串或者自定义类型. 相对于声明number0,numbe ...

  6. 在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性:

    在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性: var s = new MyString("hello"); s ...

  7. AngularJS内建服务以及自定义服务的用法

    在AngularJS中, 服务是一个比较重要的部分,它是一个对象或者是函数,可以在你的AngularJS的应用中使用.接下来介绍几种比较常用的内建服务以及自定义服务的方法. [内建服务] (1)loc ...

  8. js的内建arguments数组

    调用函数时,只需在函数名后加一对用于传递参数的括号即可.var result = sum(1,2) 如果调用参数(a,b)的时候没有给值,则值默认为undefined.即使传递参数过多,多余的部分也会 ...

  9. Python中3种内建数据结构:列表、元组和字典

    Python中3种内建数据结构:列表.元组和字典 Python中有3种内建的数据结构:列表.元组和字典.参考简明Python教程 1. 列表 list是处理一组有序项目的数据结构,即你可以在一个列表中 ...

随机推荐

  1. [DPI] Cisco Application Visibility and Control

    DPI,可分为三部分: https://blogs.cisco.com/enterprise/cisco-traffic-analysis-encrypted-threat-analytics 知名端 ...

  2. Python中的format函数

    format是python2.6新增的一个格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能替代字符串类型 2.单个参数可以多次输出,参数顺序 ...

  3. 转:GET和POST两种基本请求方法的区别

    原文地址:GET和POST两种基本请求方法的区别 原文如下: GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL ...

  4. LDA学习小记

    看到一段对主题模型的总结,感觉很精辟: 如何找到文本隐含的主题呢?常用的方法一般都是基于统计学的生成方法.即假设以一定的概率选择了一个主题,然后以一定的概率选择当前主题的词.最后这些词组成了我们当前的 ...

  5. 浅谈Trie树

    Trie树,也叫字典树.顾名思义,它就是一个字典 字典是干什么的?查找单词!(英文字典哦) 个人认为字典树这个名字起得特别好,因为它真的跟字典特别像,一会r你就知道了. 注:trie的中文翻译就是单词 ...

  6. 筛选BETWEEN '2018-1-1 00:00:00' AND '2018-5-18 00:00:00'每日`status`='1'的记录总条数

    最近做了一个小任务,要求是:使用MySQL #筛选BETWEEN '2018-1-1 00:00:00' AND '2018-5-18 00:00:00'每日`status`='1'的记录总条数 SE ...

  7. mysql 权限管理 目录

    mysql 权限管理介绍 mysql 权限管理 记录 mysql 权限管理 grant 命令 mysql 权限管理 revoke 回收权限 命令 mysql 权限管理 针对库 授权 db.* mysq ...

  8. linux下修改/etc/profile文件

    inux下修改/etc/profile文件 2017年01月06日 14:30:12 白昙 阅读数:8540 标签: linux 更多 个人分类: linux   通常情况下,/etc/profile ...

  9. MySQL5.7 多实例

    1,先按MySQL5.7安装好后 mkdir dbdata_3307 chown mysql:mysql -R dbdata_3307 2,./bin/mysqld  --initialize --u ...

  10. ORACLE-osi分层模型.md

    一. 标准化组织ISOISO:国际标准化组织   ( International Organization for Standardization )OSI:开放系统互联   ( open syste ...