七、C数组的介绍

1、前言

        C语言中的数据类型包括基本数据类型和复合数据类型。前面介绍的整形、浮点型、字符型都是基本数据类型,而数组属于复合数据类型。

        基本数据类型是编程中最基础的数据类型,用于存储简单的数据值。复合数据类型则是由基本数据类型组合而成的数据类型,用于存储更复杂的数据结构。

2、数组的定义

(1)数组就是相同数据类型的多个数据放在一起。

(2)在C语言中要定义一个数组,需要指定元素的类型和元素的数量,如下所示:

// 数据类型  数组名[元素个数];
// type arrayName [ arraySize ]; 

int a[10];

(3)注意点:

  • 数据类型可以是任意有效的C数据类型。
  • 数组中的所有元素必须是同一种数据类型。
  • 元素个数不能为0,必须大于0的整数常量。

3、数组的初始化

3.1、定义时初始化 & 每一个元素单独初始化

(1)定义时初始化

int a[4] = {0, 5, 2, ,3};  

大括号 { } 之间的值的数目不能大于我们在数组定义时在方括号 [ ] 中指定的元素数目。如果你省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:

int a[] = {0, 5, 2, ,3};  

您将创建一个数组,它与前一个实例中所创建的数组是完全相同的,元素个数为4个。

(2)每一个元素单独初始化

int a[4];  

a[0] = 0;
a[1] = 5;
a[2] = 2;
a[3] = 3;

3.2、完全初始化 & 不完全初始化

(1)完全初始化

int a[4] = {33, 24, 34, 23};

/* 定义数组同时初始化,则可以省略数组定义时[]中的元素个数。
 * C语言编译器会自动计算其元素个数,计算依据是初始化式中初始化元素的个数。
 * 由此可知,省略[]中数组元素个数只有一种情况,那就是后面的初始化式必须为完全初始化。
 */
int b[] = {0, 1, 2, 3, 4};    // 数组的元素个数为5

(2)不完全初始化

  • 不完全初始化式中的值从a[0]开始,依次向后赋值,不足的默认用0填充赋值。
  • 局部变量的数组,不初始化时,每一个元素的值是随机的。
int a[4] = {23, 34, 24};   // 不完全初始化
int a[4] = {23, 34};       // 不完全初始化
int a[4] = {23};           // 不完全初始化
int a[4] = {};             // 不完全初始化

int a[4];                  // 不初始化

4、数组的访问

(1)数组定时的时候作为整体定义,但是在使用时不能不作为整体使用,需要拆开使用数组中的各个元素。

(2)譬如定义数组 int a [4]; ,使用其中的四个元素,分别是a[0]、a[1]、a[2]、a[3],其中[]是数组的标志,[]中的数字叫做数组下标(index,索引),下标是我们访问数组中各个元素的指引。

(3)数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。

5、不同数据类型数组

(1)不同数据类型的一组数组合成不同类型的数组,如下所示:

int    a[5];        // 整形数组
float  a[5];        // 浮点型数组
double a[5];        // 双精度浮点型数组
char   a[5];        // 字符数组

(2)C语言程序中,变量的实质就是内存中的一个格子。当我们定义(创造一个变量)了一个变量后,就相当于在内存中得到了一个格子,这个格子的名字就是变量名,以后访问这个内存格子就使用该变量名就行了。这就是变量的本质。

(3)数据类型的实质是内存中格子的不同种类,譬如在32位机器上:

 数据类型占用内存空间
短整形格子(short) 2字节空间 16位
整形格子(int)4字节空间 32位
单精度浮点型格子(float)4字节空间 32位
双精度浮点型格子(double)8字节空间 64位
字符型格子(char)1字节空间 8位

6、获取数组长度

6.1、sizeof运算符

(1)计算数据类型的大小:占多少字节

printf("%d\r\n", sizeof(short));
printf("%d\r\n", sizeof(int));
printf("%d\r\n", sizeof(float));

(2)计算变量的大小:占多少字节

int a = 0;
prinf("d\r\n", sizeof(a));

char b = 0;
prinf("d\r\n", sizeof(b));

float c[4] = {};
printf("d\r\n", sizeof(c));   // 计算数组c大小,单位字节

6.2、计算数组长度:数组的元素个数

(1)数组长度可以使用 sizeof 运算符来获取数组的长度,例如:

int numbers[] = {1, 2, 3, 4, 5};
int length = sizeof(numbers) / sizeof(numbers[0]);

(2)举例

#include <stdio.h>

int main() {
    int array[] = {1, 2, 3, 4, 5};
    int length = sizeof(array) / sizeof(array[0]);

    printf("length = %d\n", length);

    return 0;
}

(3)使用宏定义

#include <stdio.h>

#define LENGTH(array) (sizeof(array) / sizeof(array[0]))

int main() 
{
    int array[] = {1, 2, 3, 4, 5};
    int length = LENGTH(array);

    printf("length = %d\n", length);

    return 0;
}

7、字符数组

7.1、字符数组的定义

(1)字符数组和其他数组定义上并无本质区别。

(2)字符数组中的元素可以理解为0~255的整数或者字符。

(3)字符与整数之间采用ASCII编码。

(4)char类型做整形时,范围是 -127~128;做字符时范围是 0~127。

char a[10];

7.2、字符数组的初始化

(1)赋值为字符

  • 在C语言中引用单个字符时,应该用单引号' ',例如'a'
  • 在C语言中引用字符串时,应该用" ",例如"abcde"
  • "abcde"实际上有6个字符,分别是'a' 'b' 'c' 'd' 'e' '\0'
  • '\0'是C语言中定义的字符串的结尾标志。所以,当c语言程序中使用"abcde"这种方式去初始化时,编译器会自动在字符'e'后面添加一个'\0'。
  • '\0' 这个字符是ASCII码表中的第一个字符,是不可见字符,也就是在屏幕上不可显示,程序中使用转义字符来表示,即'\0';它的编码值是0。
char a[5] = {'a', 'b', 'c', 'd', 'e'};

// 数组的元素个数为5,字符串结尾的'\0'存储不到数组中,但也不会发生数组越界,不会报错
char b[5] = "abcde"; 
  
// 数组的元素个数为6
char c[] = "abcde";  

// 定义时数组会越界,报错 
//char a[5] = "abcdef";          

(2)赋值为整数

char a[4] = {48, 49, 50, 51};

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言初学者必看! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   面向对象编程和可视化集成开发工具的发展,使很多曾经非常流行的编程语言影响下降甚至逐步消失,但有一种语言是例外,它就是C语言,时光流逝丝毫没减低C的魅力,它的风采依然如旧。   C语言已经深深的进入各种操作系统,通过对C语言的学习,能够很快的掌握操作系统的底层结构和操作方式,因此C语言是学习编程的首选语言。为满足广大读者的要求,本期专题特别推出C语言初级教程。  第一讲 慨述   早期的C语言主要是用于UNIX系统。由于C语言的强大功能和各方面的优点逐渐为人们认识,到了八十年代,C开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用。成为当代最优秀的程序设计语言之一。    第二讲 数据类型   在本讲中,我们只介绍数据类型说明。其它说明在以后陆续介绍。所谓数据类型是按被说明量的性质,表示形式,占据存储空间的多少,构造特点来划分的。在C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。                       第三讲 基础语句   C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。     第四讲 运算符和表达式   C语言中运算符和表达式数量之多, 在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分完善。 这也是C语言的主要特点之一。      第五讲 输入输出   在C语言中,所有的数据输入/输出都是由库函数完成的,因此都是函数语句。本小节先介绍printf函数和putchar函数。                           第六讲 分支结构   C语言提供了多种形式的条件语句以构成分支结构,如:if、if...else、switch等,这几种形式的条件语句一般来说是可以互相替代的。         第讲 循环结构   循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。                          第八讲 转移语句   程序中的语句通常总是按顺序方向, 或按语句功能所定义的方向执行的。如果需要改变程序的正常流向, 可以使用本小节介绍的转移语句。      第九讲 数组   数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。                            第十讲 函数   函数是C源程序的基本模块, 通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。                              第十一讲 指针的慨念    指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。               第十二讲 多维数组的指针变量    二维数组指针变量说明的一般形式为: 类型说明符 (*指针变量名)[长度] 其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。                  第十三讲 结构    “结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。                            第十四讲 联合    “联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。                      第十五讲 枚举与位运算    在“枚举”类型的定义中列举出所有可能的取值, 被说明为该“枚举”类型的变量取值不能超过定义的范围。                        第十六讲 预处理    所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。               第十讲 文件    所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。
第一章 C程序设计筑基..........................................................................................................1 1.1 二进制基础.................................................................................................................1 1.1.1 为什么采用二进制.........................................................................................1 1.1.2 二进制、十六进制和八进制...........................................................................2 1.1.3 原码、反码与补码...........................................................................................4 1.1.4 模216原则.......................................................................................................7 1.1.5 浮点小数的二进制表示.................................................................................8 1.2 程序员眼中的计算机.................................................................................................9 1.2.1 数据在计算机中的存储形式.........................................................................9 1.2.2 计算机的运行方式与特点...........................................................................11 1.3 程序设计的方法......................................................................................................13 1.3.1 程序设计的两大要素...........................................................................13 1.3.2 算法的描述.......................................................................................15 1.3.3 流程的跟踪执行...........................................................................18 1.4 C程序初步......................................................................................................19 1.4.1 计算机语言分类...........................................................................19 1.4.2 C语言简史及特点.................................................................................20 1.4.3 C程序示例及组成...........................................................................21 1.5 C程序解题分析.................................................................................................25 1.5.1 详解判断素数程序.......................................................................................25 1.5.2 综合示例......................................................................................................32 1.5.3 C程序书写风格...........................................................................................34 1.6 编程学习方法总结...................................................................................................36 第二章 上机指导与解题分析..............................................................................................39 2.1 上机编程环境...........................................................................................................39 2.2 Turbo C集成开发环境............................................................................….............40 2.2.1 Turbo C集成开发环境介绍.........................................................................40 2.2.2 文本编辑..................................................................….............................42 2.2.3 编译和连接..........................................….....................................…............44 2.2.4 程序运行与调试..................................….....................................…............46 2.2.5 Turbo C环境设置..............................….....................................…............50 2.3 常见的变量类型、运算符及输入出格式.....…........................................…............50 2.4 程序举例.............................................…...................………..........….....…............52 2.5 Turbo C上机实验...............................….....…..……............…....….......…............59 第三章 基本数据类型、运算符与输入输出函数...….....…..…….…....…......…............67 3.1 基本数据类型...….....…..……………….....…....…..…....….......….......………....67 3.2 常量……………………..……………….............…...…..…....…….......………....67 3.2.1 整型常量…….…….……………........…....…..….........….......………....67 3.2.2 实型常量…..………………………….............…..….....….......………....68 3.2.3 字符常量…..…………………………….............…....….....…....…...…....68 3.2.4 字符串常量…..………………………….............…....….....…....…...…....69 3.2.5 符号常量…..…………………………….............…....….....…....…...…....69 3.3 变量…..…………………………………...........…………....….....….......……...70 3.3.1 C标识符……………………...........…………..........….......…….……...70 3.3.2 整型变量………………….....…......…………..........….......…………...70 3.3.3 实型变量….....……………………......…………..........….......………...71 3.3.4 字符型变量………………………………………......….....…………….71 3.3.5 变量的初始化………………...…......…………..........….......…………...72 3.4 C语言的运算符和表达式……………...........…………....…......….......……....72 3.4.1 算术运算符和算术表达式..………………….…....….....….......……...73 3.4.2 赋值运算符和赋值表达式………..……..……….…....….....…...……....74 3.4.3 关系运算符和关系表达式………….........…….…....….....….....……….74 3.4.4 逻辑运算符和逻辑表达式………....…...……….…....….....…...……....75 3.4.5 条件运算符和条件表达式………...........……….…....….....…...……....76 3.4.6 逗号运算符和逗号表达式………...........……….…....….....…...……....78 3.4.7 指针运算符………....………...……........……….…....….....…...……....78 3.4.8 sizeof运算符…………..………….........……….…....….....…...……....79 3.4.9 不同类型数据之间的转换………...........……….…....….....…...……....79 3.4.10 C运算符优先级和结合性………….......……….…....….....…...……....80 3.5 输入输出函数……………………………........…………....…......….......……....80 3.5.1 格式化输入输出函数..……………………….…....….....….......……...81 3.5.2 字符输入输出函数………..……………..……….…....….....…...……....84 第四章 语句与程序控制结构……………………………..........……….….........……....89 4.1 语句总述…………………………………….......…….…......….....….....….....…89 4.1.1 说明语句、表达式语句和空语句……………..........…….........………....89 4.1.2 控制语句………………………….........………....….....….....………....89 4.1.3 复合语句……….….……………….......……………....….....….......…....89 4.2 顺序结构…………………………………………......………......….......………..90 4.3 选择结构………….…………………………...........………....….....….......…....91 4.3.1 if语句…………….………….…..........…….…….....….......………..91 4.3.2 switch语句…………...........……………….……....….....….......………..95 4.4 循环结构…………………………………….......…….…......….....….....….....…100 4.4.1 while语句……………………………………..........…...........………....100 4.4.2 do-while语句…………………….........………....….....….....………....102 4.4.3 for语句……….….………………........……………....….....….......…....103 4.4.4 break语句……….….……………........……………....….....….......…....105 4.4.5 continue语句……….….…......……....……………....….....….......…....107 4.4.6 goto语句…………………….…..........……………....….....….......…....108 4.4.7 多重循环………………….….…..........……………....….....….......…....109 4.5 程序举例……….….………………..........…………………....…..............….......111 第五章 数组和字符串…..………………......……………...…………....…........……....117 5.1 一维数组…..………..…………....…........…………………...…........………....117 5.1.1 一维数组的定义和引用..………..…...........…………....…......………..117 5.1.2 一维数组初始化…..…………..…..…...........…………....…....………..118 5.1.3 程序举例…..………..…..…..…..……........…………....…......………....120 5.2 二维数组…………….........…..…..………………………………....…......…....127 5.2.1 二维数组的定义和引用…………..…...………………....…....………....127 5.2.2 二维数组初始化……………..…..………………………....…......…....128 5.2.3 程序举例…………………..………………………………………..…….129 5.3 字符串处理…………..…..…..…..…..….........……………………...…......…....133 5.3.1 字符数组与字符串………..…..…..…..……......………….…....…..…....133 5.3.2 字符串的输入和输出…………….......…..…...……………......…..…....133 5.3.3 字符串处理函数….………….....…………………………....…....……...136 5.3.4 程序举例…….........……..…..………………………....…...…...……...138 第六章 函数..…..……....…......……………………………...………….………………...144 6.1 模块化程序设计思想…….........…………………..…………....…......………..144 6.2 模块设计举例.........……………………………………………..…….......……...144 6.3 函数概念….........……………………………………….……....…......………..145 6.3.1 函数定义….........……………………………..…..……....…......……...145 6.3.2 函数说明和函数调用……………………….…….……....….....………..146 6.3.3 形参与实参...………………………………..…….……....….....……...149 6.3.4 函数返回值.......……………………………..…..……....…......………..150 6.3.5 传值与传址...………………………………..…….……....….....……...151 6.3.6 数组作为函数的参数的例子……………………….……....….....……...152 6.4 函数的嵌套........……………………………....…......…………………………...153 6.5 函数的递归………..…..………….…………...….......………………………...155 6.6 变量作用域和存储类别………..…..………………….…………………………160 6.6.1 局部变量和全局变量…….……….....…………………….……………..160 6.6.2 变量存储类别…..…..……....…......……………………….……………..161 6.7 使用库函数………..…..…………………………...……………………………162 6.8 程序举例………..…..……………………………………………...……………165 第章 指针..…..……....…......……………………...………….………………...170 7.1 指针概念..…..……....…......………………………………….……………...170 7.2 指针变量的定义和使用..………….....…......………….……….………....172 7.3 指针与一维数组……......…......………………….……………………..….....175 7.3.1 一维数组的内存安排…......…………......….….…...…………..………..175 7.3.2 指向数组的指针运算...…………...…………….……….…………..…...176 7.3.3 下标法与指针法表示的等价性…….....…...…………………….………...178 7.3.4 程序举例……………….……………….………..…..……….……….....179 7.4 指针与函数……......…......…………….…………………………………..….....181 7.4.1 指针作为函数参数…......…………......….….……...…………..………..181 7.4.2 指针做为函数返回类型...…………...………….……….…………..…...184 7.4.3 动态内存分配与释放函数…….....…...…………......………….………...185 7.4.4 函数指针……………….……………….………..…..……….……….....187 7.5 指针数组、多级指针与指向一维数组的指针………….……………………..….....189 7.5.1 指针数组与多级指针…......…………......….….…...…………..………..189 7.5.2 二维数组与指向一维数组的指针...………….……….…………..…...191 7.5.3 二维数据的构造举例…….....…...……………......………….………...193 7.6 指针与字符串……......…......…………….…………………………………..….....194 7.6.1 字符串的内存安排…......…………......….….……...…………..………..194 7.6.2 字符串处理程序举例...…………...………….………….…………..…...196 7.6.3 多字符串的表示与处理…….....…...……………......………….………...198 7.6.4 程序举例……………….……………….………..…..……….……….....202 7.6.5 命令行参数…………….……………….………..…..……….……….....207 第八章 结构体、联合与枚举..……………......……………...…………....…........……....211 8.1 概述…..………………………....……........…………………...…........………....211 8.2 结构体类型定义………….........…..………………………………....…......…....211 8.3 结构体变量………….........………………………………………....…......…....212 8.3.1 结构体变量的定义…………………...………………....…....………....212 8.3.2 结构体变量的引用…………..…….………………………....…......…....214 8.3.3 结构体变量初始化………..……………………………………..……….215 8.4 结构体数组…………..…..…..…..…..……......……………………...…......…....216 8.4.1 结构体数组的定义………..…..……..……......………….…....…..…....216 8.4.2 结构体数组初始化与引用…………….......…..……………......…..…....217 8.4.3 结构体数组的输入和输出.………….....…………………....…....……...217 8.5 指向结构体类型数据的指针……..…..……....……………………...…......…....218 8.5.1 定义和初始化………..…..…..…..……………..………….…....…..…....219 8.5.2 用结构体指针引用结构体成员…………….......…………......…..…....219 8.5.3 指向结构体数组的指针.………….....…………………....……………...219 8.6 结构体与函数…………..…..…..…..…..…......……………………...…......…....221 8.6.1 向函数传递结构信息………..…..…..…..……………….…....…..…....221 8.6.2 结构体指针作为函数返回值…………….......…..…………......…..…....223 8.7 单链表……..……………………………........……………………...…......…....225 8.7.1 概述………..…..…..…..……………………......………….…....…..…....225 8.7.2 结点定义…………….......…………………………………......…..…....226 8.7.3 建立链表.………….....……………………………………....…....……...226 8.7.4 输出链表.………….....……………………………………....…....……...233 8.7.5 插入结点.………….....……………………………………....…....……...234 8.7.6 删除结点.………….....……………………………………....…....……...236 8.7.7 程序举例.………….....……………………………………....…....……...238 8.7.8 其他链表结构………….....…………………....………………….……...242 8.8 联合与枚举……..…..………………………....……………………...…......…....244 8.8.1 联合类型………..…..…..…………………......………….…....…..…....244 8.8.2 枚举类型…………….......…………………………………......…..…....246 8.8.3 复杂类型举例………….....………………………………....…....……...248 8.9 用typedef定义类型……..…..…........……………………………...…......…....250 第九章 文件…..…………………………......……………...…………....…........……....252 9.1 文件概述…..………..……………..…........…………………...…........………....252 9.2 文件打开和关闭..……….………………………......…………....…......………..252 9.3 文本文件的输入与输出….........…..………………………………....…......…....255 9.3.1 读写一个字符的函数…………..……………………....…....………....255 9.3.2 字符串读写函数…………..…..…………………………....…......…....256 9.3.3 格式化读写函数……………..…………....……………………...……...258 9.4 二进制文件的输入与输出…..…..…...….........……………………...…......…....261 9.5 其他文件库函数…..…..…...…................………........……………...…......…....264 9.5.1 文件的定位函数……….....…..…..…..……......………….…....…..…....264 9.5.2 出错监测函数…………….......…..…...………………………......……...265 第十章 预处理和位运算..…………………....……………...…………....…........……....267 10.1 预处理…..……………………..……........…………………...…........………....267 10.1.1 概述………..…..…..………………………......………….…....…..…....267 10.1.2 宏定义……..…..…..…..…………………......………….…....…..…....267 10.1.3 文件包含…..…..…..…..…………………......………….…....…..…....270 10.1.4 条件编译…..…..………..…………………......………….…....…..…....271 10.2 位运算………….........…..………………………………………....…......…....272 附录Ⅰ 常用ASCII码对照表…………………………………………………………….278 附录Ⅱ C语言的关键字表…......…………………...…………….…….….………….....279 附录Ⅲ C语言的运算符表.......…………………………...…………….……..……..…..280 附录Ⅳ C常用的库函数…......…....…………..……………………...….….…..…….....281 参考资料…......…....…………..…..…..…..…..…..…………………...….….…..…….....284
第八章:枚举,位运算 枚举   在实际问题中, 有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有天,一年只有十二个月, 一个班每周有六门课程等等。如果把这些量说明为整型, 字符型或其它类型显然是不妥当的。 为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值, 被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是, 枚举类型是一种基本数据类型,而不是一种构造类型, 因为它不能再分解为任何基本类型。 枚举类型的定义和枚举变量的说明 一、枚举的定义枚举类型定义的一般形式为: enum 枚举名 { 枚举值表 }; 在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。 例如: enum weekday { sun,mou,tue,wed,thu,fri,sat }; 该枚举名为weekday,枚举值共有7个,即一周中的天。 凡被说明为weekday类型变量的取值只能是天中的某一天。 二、枚举变量的说明 如同结构和联合一样,枚举变量也可用不同的方式说明, 即先定义后说明,同时定义说明或直接说明。设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式: enum weekday { ...... }; enum weekday a,b,c;或者为: enum weekday { ...... }a,b,c;或者为: enum { ...... }a,b,c; 枚举类型变量的赋值和使用 枚举类型在使用中有以下规定: 1. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值: sun=5;mon=2;sun=mon; 都是错误的。 2. 枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1, …,sat值为6。 main(){ enum weekday { sun,mon,tue,wed,thu,fri,sat } a,b,c; a=sun; b=mon; c=tue; printf("%d,%d,%d",a,b,c); } 3. 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如: a=sum;b=mon; 是正确的。而: a=0;b=1; 是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换,如: a=(enum weekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于: a=tue; 还应该说明的是枚举元素不是字符常量也不是字符串常量, 使用时不要加单、双引号。 main(){ enum body { a,b,c,d } month[31],j; int i; j=a; for(i=1;i<=30;i++){ month[i]=j; j++; if (j>d) j=a; } for(i=1;i<=30;i++){ switch(month[i]) { case a:printf(" %2d %c\t",i,'a'); break; case b:printf(" %2d %c\t",i,'b'); break; case c:printf(" %2d %c\t",i,'c'); break; case d:printf(" %2d %c\t",i,'d'); break; default:break; } } printf("\n"); } 位运算   前面介绍的各种运算都是以字节作为最基本位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。 一、位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。 例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。   按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。 main(){ int a=9,b=5,c; c=a&b; printf("a=%d\nb=%d\nc=%d\n",a,b,c); } 2. 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。 例如:9|5可写算式如下: 00001001|00000101 00001101 (十进制为13)可见9|5=13 main(){ int a=9,b=5,c; c=a|b; printf("a=%d\nb=%d\nc=%d\n",a,b,c); } 3. 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12) main(){ int a=9; a=a^15; printf("a=%d\n",a); } 4. 求反运算 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110 5. 左移运算 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数, 高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。6. 右移运算 右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。 例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。 main(){ unsigned a,b; printf("input a number: "); scanf("%d",&a); b=a>>5; b=b&15; printf("a=%d\tb=%d\n",a,b); } 请再看一例! main(){ char a='a',b='b'; int p,c,d; p=a; p=(p<<8)|b; d=p&0xff; c=(p&0xff00)>>8; printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d); } 位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符 位域名:位域长度 例如: struct bs { int a:8; int b:2; int c:6; }; 位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如: struct bs { int a:8; int b:2; int c:6; }data; 说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明: 1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如: struct bs { unsigned a:4 unsigned :0 /*空域*/ unsigned b:4 /*从下一单元开始存放*/ unsigned c:4 } 在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。 2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。 3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如: struct k { int a:1 int :2 /*该2位不能使用*/ int b:3 int c:2 }; 从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。 二、位域的使用位域的使用和结构成员的使用相同,其一般形式为: 位域变量名?位域名 位域允许用各种格式输出。 main(){ struct bs { unsigned a:1; unsigned b:3; unsigned c:4; } bit,*pbit; bit.a=1; bit.b=7; bit.c=15; printf("%d,%d,%d\n",bit.a,bit.b,bit.c); pbit=&bit; pbit->a=0; pbit->b&=3; pbit->c|=1; printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c); } 上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。 程序的9、10、11三行分别给三个位域赋值。( 应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=", 该行相当于: pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,程序第16行中使用了复合位运算"|=", 相当于: pbit->c=pbit->c|1其结果为15。程序第17行用指针方式输出了这三个域的值。 类型定义符typedef C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。 类型定义符typedef即可用来完成此功能。例如,有整型量a,b,其说明如下: int aa,b; 其中int是整型变量的类型说明符。int的完整写法为integer, 为了增加程序的可读性,可把整型说明符用typedef定义为: typedef int INTEGER 这以后就可用INTEGER来代替int作整型变量的类型说明了。 例如: INTEGER a,b;它等效于: int a,b; 用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。例如: typedef char NAME[20]; 表示NAME是字符数组类型,数组长度为20。 然后可用NAME 说明变量,如: NAME a1,a2,s1,s2;完全等效于: char a1[20],a2[20],s1[20],s2[20] 又如: typedef struct stu{ char name[20]; int age; char sex; } STU; 定义STU表示stu的结构类型,然后可用STU来说明结构变量: STU body1,body2; typedef定义的一般形式为: typedef 原类型名 新类型名 其中原类型名中含有定义部分,新类型名一般用大写表示, 以 便于区别。在有时也可用宏定义来代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的,后者更为灵活方便。 本章小结 1. 枚举是一种基本数据类型。枚举变量的取值是有限的,枚举元素是常量,不是变量。 2. 枚举变量通常由赋值语句赋值,而不由动态输入赋值。枚举元素虽可由系统或用户定义一个顺序值,但枚举元素和整数并不相同,它们属于不同的类型。因此,也不能用printf语句来输出元素值(可输出顺序值)。 3. 位运算是C语言的一种特殊运算功能, 它是以二进制位为单位进行运算的。位运算符只有逻辑运算和移位运算两类。位运算符可以与赋值符一起组成复合赋值符。如&=,|=,^=,>>=,<<=等。 4. 利用位运算可以完成汇编语言的某些功能,如置位,位清零,移位等。还可进行数据的压缩存储和并行运算。 5. 位域在本质上也是结构类型,不过它的成员按二进制位分配内存。其定义、说明及使用的方式都与结构相同。 6. 位域提供了一种手段,使得可在高级语言中实现数据的压缩,节省了存储空间,同时也提高了程序的效率。 7. 类型定义typedef 向用户提供了一种自定义类型说明符的手段,照顾了用户编程使用词汇的习惯,又增加了程序的可读性。 资料收集:beck Copyright 2002 www.vcok.com, All Rights Reserved
从零开始学单片机C语言 内容简介: 本书定位于让初学者从零起步,轻松学会单片机高级编程C语言以及实战技术。书中首先简要介绍了8051单片机的主要构成,然后重点介绍单片机Cx51高级编程语言开发与仿真环境的使用方法,透彻地分析了Cx51的语法结构,并给出了大量实例。书中大多数实例和全部实验都经过了实验板的验证。 本书可供具有一定单片机基础的初学者,以及广大从事单片机应用系统开发研制的工技术人员阅读,也可以作为有关院校相关专业的教学参考用书。 目录: 第一章 单片基础知识  第一节 51系列单片机概述  第二节 80C51单片机的内部结构和外部引脚  第三节 80C51单片机的内部结构和外部引脚  第四节 51系列单片机的并行输入/输出接口  第五节 80C51单片机的时钟电路和复位电路 第二章 单片机C语言入门  第一节 认识C语言  第二节 简单C语言  第三节 单片机C语言开发步骤 第三章 单片机实验硬件环境的建立  第一节 单片机实验板  第二节 单片机仿真器  第三节 单片机编程器 第四章 Keli Cx51软件的使用  第一节 Keil Cx51简介  第二节  Keil Cx51软件的安装   第三节 uVision2集成开发环境  第四节 常用窗口介绍 第五章 Cx51数据与运算  第一节 标识符和关键字  第二节 数据类型  第三节 常量  第四节 变量   第五节 运算符和表达式 第六章  Cx51的基本语句  第一节 表达式语句和复合语句   第二节 条件选择语句   第三节 循环语句 第章 Cx51函数  第一节 函数的分类和定义   第二节 函数的参数和返回值  第三节 函数的调用  第四节 函数变量的存储方式和种类 第八章 Cx51构造数据类型  第一节 数组  第二节 指针  第三节 结构  第四节 共用体  第五节 枚举 第九章 单片机中断、定时器串行口的C语言编程  第一节 单片机中断系统C语言编程   第二节 定时/计数器及实验  第三节 串行数据通信技术及实验  第十章 单片机实用接口C语言编程技术  第一节 LED显示器接口   第二节 链盘接口   第三节 LCD显示器接口   第四节 I2C总线接口  第五节 A/D和D/A转换接口   第六节 单片机应用技术综合实例 附录一 运算符的优先级和结合性 附录二 Keil Cx51编译器常见警告与错误信息的解决方法 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码织梦师小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值