c语言数组知识点

2024-08-20 版权声明 我要投稿

c语言数组知识点

c语言数组知识点 篇1

问题描述:

在全局声明的数组与在局部声明的数组有着不同的效果。

首先来看一个程序:

#include

#include

#define MAX 10

char a[MAX];

int main()

{

int i;

char b[MAX];

char *c=(char *)malloc(MAX * sizeof(char));

printf(“ Array a: ”);

for(i=0;i

printf(“%d ”,a[i]);

printf(“ Array b: ”);

for(i=0;i

printf(“%d ”,b[i]);

printf(“ Array c: ”);

for(i=0;i

printf(“%d ”,c[i]);

printf(“ Done”);

free(c);

return 1;

}

编译运行结果:

程序主要功能是打印字符数组的Ascii码。可以发现全局数组a和动态生成的数组c有着相同的结果,而局部声明的数组b确被分配了随机的数值,也许这就是问题的所在。

解决方案:

#include

#include

#define MAX 10

char a[MAX]={0};

int main()

{

int i;

char b[MAX]={0};

char *c=(char *)malloc(MAX * sizeof(char));

printf(“ Array a: ”);

for(i=0;i

printf(“%d ”,a[i]);

printf(“ Array b: ”);

for(i=0;i

printf(“%d ”,b[i]);

printf(“ Array c: ”);

for(i=0;i

printf(“%d ”,c[i]);

printf(“ Done”);

free(c);

return 1;

}

运行结果:

在数组的初始化中,假设初始化的数值个数小于数组的大小,则全部用0来填充,

这里通过初始化一个值,就可以给数组一个确定的结果。

(在不同系统和不同的编译器可能会出现不同的结果)

还有一个小问题就是C语言中空格的问题,看下面的程序。

#include

#include

#define MAX 10

int main()

{

int i;

char b[MAX]={0};

gets(b);

printf(“ Array b: ”);

for(i=0;i

printf(“%d ”,b[i]);

printf(“ Done”);

return 1;

}

在这里,我输入了“ int”(三个空格+int),打印的结果如上图。

b中前三个记录了空格的Ascii码,即32。

b中后面没有使用的空间依然是0。

打完收工。

c语言数组知识点 篇2

在C语言程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,数组元素共用一个名称(即数组名),通过元素在数组序列的顺序号(即下标)来区分,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别[1]。

在C语言中,对数组定义的理解虽然看似简单,但由于数组的使用范围相当广泛,在对字符串、指针、函数等的过程中,都离不开数组。因此有必要对数组在解决实际问题中一些基本操作进行总结。

学习数组的关键要掌握它的定义、赋值和应用。

数组的应用可以分为排序、插入、删除、合并、查询,还可用来存储大数据等,下面分别介绍这些应用操作。

1 数组排序

数组排序是C语言中的一项重要内容,也是以后几种应用的基础。所谓排序就是杂乱无章的数据按照大小顺序排列,包括整型、实型、字符串的排序。排序的方法有很多种,常用的有交换法、插入法,其中交换法包括冒泡排序法和快速排序。我们以冒泡法排序为例。

冒泡法排序的思想是:对于n个数从小到大排序,将数组中相邻两个数进行比较,将小的调到前头,也就是说,第一个数和第二个数比较,大数放前,小数放后,第二个和第三个进行比较,大数放前,小数放后,依此类推,……,经过第一轮比较后,找到一个最大数在最下面。然后进行下一轮比较,一共要n-1轮就可把所有的数都排好序[2]。其算法描述的流程图如图一所示:

如果用一般变量来做这道题,将定义十个变量,而且在比较排序过程不能使用循环的方法一次解决问题,用数组的话就可以很方便地解决这个问题。在冒泡排序算法中很多同学在计算每轮中比较的次数出现问题。

2 数组插入

数组插入指的是有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。假如现在有一个由n个元素按照升序构成的数组,在插入一个数x时按下面的方法处理:

(1)如果插入的数x比a数组最后一个数大,则将插入的数放在a数组末尾。

(2)如果插入的数x不比a数组最后一个数大,则将x依次和a[0]到a[n-1]比较,直到出现a[i]>x为止,这时表示x应该插入到a[i-1]之后,a[i]之前。所以要将a[i]到a[n-1]各元素向后移一个位置(即a[n-1]变成a[n],a[n-2]变成a[n-1],…,a[i]变成a[i+1]),然后将x放在a[i]中[3]。该算法描述的流程图如图二所示:

在数组插入中,学生们容易出现数组越界问题,他们在定义数组时,数组的容量定义为n,应使数组的容量比原来的容量要大于1,因为要插入一个元素到数组中,数组元素个数会从原先的n个变成n+1个。还有一个比较容易犯错的问题是当一旦发现a[i]比x大时,没有中断比较的循环,导致插入错误。

3 数组删除

数组删除操作指的是用户从键盘中输入一个数,然后到数组中去查找这个数。如果数组中存在该数,则把该数从数组中删除掉;如果数组中不存在该数,则不用做删除操作。例如,有一个数组a,其中元素为1,2,2,2,5,4,2,3,若用户从键盘上输入一个数2,则要在数组中删掉2,删除之后的数组元素只有1,5,4,3。该删除操作算法的流程图如图三所示:

在数组删除操作中,学生们容易忽略要删除的元素在数组中连续出现的这种现象,导致漏删,所以程序中一定要当删掉一个元素时,循环变量i的值倒退一次,即i--。为了要正确输出删除之后的数组元素,应该在该程序中用一个变量count来计算删掉了几个元素。

4 数组合并

数组合并操作指的是对两个有序的数组合并之后仍然有序。例如:a[4]={1,5,100,200},b[3]={2,7,90},合并之后存放到数组c中,则c[7]={1,2,5,7,90,100,200}。该算法描述的流程图如图四所示:

在数组合并操作中,学生们容易遗漏a数组或b数组中末尾的一些元素。

5 数组查询

从数组中查询一个数最简单的方法是从第1个数开始顺序查找,将要找的数与数组中的数一一比较,直到找到为止(如果数组中无此数,则应找到最后一个数,然后判定“找不到”)。但这种“顺序查找法”效率低,如果数组中有1000个数,且要找的数恰好是第1000个数,则要进行999次比较才能得到结果,平均比较次数为500次。本文介绍效率较高的折半查找法,基本思路如下:

假如有已按由小到大排好序的9个数,a[1]~a[9],其值分别为:1,3,5,7,9,11,13,15,17,若输入一个数3,想查3是否在此数组中,先找出数组中居中的数,即a[5](其值为9),将3与a[5]比较有a[5]>3,显然3应当在a[1]到a[5]范围内,这样可缩小查找范围,查找范围缩小一半。再将3与a[1]到a[5]范围内的居中的数a[3](其值为5)比较有a[3]>3,则3应当在在a[1]到a[3]范围内,又将查找范围缩小一半。再将3与a[1]到a[3]范围内的居中的数a[2](其值为3)进行比较有a[3]=3,查找结束,一共比较了3次。如果数组中有n个数,则最多比较次数为int(log2n)+1。该算法的流程图由于篇幅原因,在此不列出。

6 利用数组完成高精度阶乘运算

计算机所能表示与处理的数的有效数字位数是有限的。例如,在字长32位的计算机上运行的程序中可处理的整数的最大值4294967295,对于求阶乘n!,当n较大时,会产生溢出。为了完成高精度阶乘运算,可以用一个整形数组存放一个参加运算的操作数,其中每个数组元素存放十进制表示的正整数的一个数字位。例如,程序正确时,能计算并输出8!值为10080,16!的值为2615348736000。该算法的流程图如图五所示:

在该操作中,学生们对存放阶乘结果的a数组的初始化赋值不正确,我们应该使a[0]=1,其余数组元素为0。当数组元素的值大于9时不知如何把该值分解成个位和十位,十位上的数字要进位到下个数组元素中。

7 结束语

目前很多编程专家在大型软件程序的开发中,使用数组来替代指针,可见数组是C语言编程的精髓[4]。利用它可以编写出颇有特色、质量优良的程序,实现许多用其它高级语言难以实现的功能。但数组使用比较灵活,十分容易出错。只有在编程过程中不断总结数组的使用技巧,通过在实践中不断摸索,才能准确无误地驾驭数组,所以要多做一些有关数组的应用问题。

参考文献

[1]郝彦琴.《C语言程序设计》中的数组[J].湖南农机,2008,35(11):34-35.

[2]谭浩强.C语言程序设计(第三版)[M].北京:清华大学出版社.

[3]谭浩强.C语言设计题解与上机指导(第三版)[M].北京:清华大学出版社.

c语言数组知识点 篇3

写一个函数,用于比较两个字符串的比较(string_compare).

程序分析:

(1)主要思想:传入两个字符串后,比较这两个字符串中的每个元素,如果第一次比较就不相等,就不要让它进入到下面的比较中,这样一来,将它返回一个相减的值(即:两数组中开始不相等的那两个元素相减,返回值(int类型),是ASCII码值相减)。进入比较的过程中时,相等就返回0;其他情况都返回那个相减的值。

(2)主要方式:定义指针数组,并对其初始化。然后照上面的思想,进行代码的实现。

代码如下:

C语言变长数组data[0] 篇4

今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0].这样设计的目的是让数组长度是可变的,根据需要进行分配,方便操作,节省空间。

2、data[0]结构

经常遇到的结构形状如下:

struct buffer

{

int data_len; //长度

char data[0]; //起始地址

};

在这个结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体buffer之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。

写个程序对比char data[0],char *data, char data[],如下所示:

1 #include

2 #include

3 #include

4 #include

5

6 typedef struct

7 {

8 int data_len;

9 char data[0];

10 }buff_st_1;

11

12 typedef struct

13 {

14 int data_len;

15 char *data;

16 }buff_st_2;

17

18 typedef struct

19 {

20 int data_len;

21 char data[];

22 }buff_st_3;

23

24 int main

25 {

26 printf(“sizeof(buff_st_1)=%u ”, sizeof(buff_st_1));

27 printf(“sizeof(buff_st_2)=%u ”, sizeof(buff_st_2));

28 printf(“sizeof(buff_st_3)=%u ”, sizeof(buff_st_3));

29

30 buff_st_1 buff1;

31 buff_st_2 buff2;

32 buff_st_3 buff3;

33

34 printf(“buff1 address:%p,buff1.data_len address:%p,buff1.data address:%p ”,

35 &buff1, &(buff1.data_len), buff1.data);

36

37 printf(“buff2 address:%p,buff2.data_len address:%p,buff2.data address:%p ”,

38 &buff2, &(buff2.data_len), buff2.data);

39

40 printf(“buff3 address:%p,buff3.data_len address:%p,buff3.data address:%p ”,

41 &buff3, &(buff3.data_len), buff3.data);

42

43 return 0;

44 }

从结果可以看出data[0]和data[]不占用空间,且地址紧跟在结构后面,而char *data作为指针,占用4个字节,地址不在结构之后。

3、实际当中的用法

在实际程序中,数据的长度很多是未知的,这样通过变长的数组可以方便的节省空间。对指针操作,方便数据类型的转换。测试程序如下:

1 #include

2 #include

3 #include

4 #include

5

6 typedef struct

7 {

8 int data_len;

9 char data[0];

10 }buff_st_1;

11

12 typedef struct

13 {

14 int data_len;

15 char *data;

16 }buff_st_2;

17

18 typedef struct

19 {

20 int data_len;

21 char data[];

22 }buff_st_3;

23

24 typedef struct

25 {

26 uint32_t id;

27 uint32_t age;

28 }student_st;

29

30

31 void print_stu(const student_st *stu)

32 {

33 printf(“id:%u,age:%u ”, stu->id, stu->age);

34 }

35

36 int main()

37 {

38 student_st *stu = (student_st *)malloc(sizeof(student_st));

39 stu->id = 100;

40 stu->age = 23;

41

42 student_st *tmp = NULL;

43

44 buff_st_1 *buff1 = (buff_st_1 *)malloc(sizeof(buff_st_1) + sizeof(student_st));

45 buff1->data_len = sizeof(student_st);

46 memcpy(buff1->data, stu, buff1->data_len);

47 printf(“buff1 address:%p,buff1->data_len address:%p,buff1->data address:%p ”,

48 buff1, &(buff1->data_len), buff1->data);

49

50 tmp = (student_st*)buff1->data;

51 print_stu(tmp);

52

53 buff_st_2 *buff2 = (buff_st_2 *)malloc(sizeof(buff_st_2));

54 buff2->data_len = sizeof(student_st);

55 buff2->data = (char *)malloc(buff2->data_len);

56 memcpy(buff2->data, stu, buff2->data_len);

57 printf(“buff2 address:%p,buff2->data_len address:%p,buff2->data address:%p ”,

58 buff2, &(buff2->data_len), buff2->data);

59

60 tmp = (student_st *)buff2->data;

61 print_stu(tmp);

62

63 buff_st_3 *buff3 = (buff_st_3 *)malloc(sizeof(buff_st_3) + sizeof(student_st));

64 buff3->data_len = sizeof(student_st);

65 memcpy(buff3->data, stu, buff3->data_len);

66 printf(“buff3 address:%p,buff3->data_len address:%p,buff3->data address:%p ”,

67 buff3, &(buff3->data_len), buff3->data);

68

69 tmp = (student_st*)buff1->data;

70 print_stu(tmp);

71

72 free(buff1);

73

74 free(buff2->data);

c语言数组知识点 篇5

如果在程序中定义一个变量,在对程序进行编译,系统会自动给这个变量分配内存单元,根据不同的类型,分配不同长度的空间,如int占用4个字节,char占用1个字节,内存单元中每个字节都有编号,这就是地址。由于可通过地址能够找到所需的变量单元,可以说地址指向该变量单元。打个比方,一个房间的门口挂了一个房间号301,这个301就是房间的地址,将该地址形象化为指针。对于一个内存单元来说,单元的地址(编号)即为指针,其中存放的数据才是该单元的内容。

严格地说,一个指针是一个地址,是一个常量,

而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。

例如:

int a=12;

int *p=&a;

二、指针的指针(二级指针)

简单来说,二级指针变量就是一级指针变量的地址。

例如:

int a=12;

int *p=&a;

int **=&p;

C语言指针与数组关系研究及应用 篇6

指针和数组在C语言中被广泛运用, 是C语言中功能很强的编程手段。由于两者之间关系复杂难懂, 在程序设计过程中, 易将指针和数组的关系混淆。针对这个问题, 本文对C语言中指针和数组的关系进行了透彻分析。

2、指针与数组关系

指针是用于存放另一个变量地址的变量。数组是有序数据的集合, 其中每个数据都有相同的数据类型。指针变量中保存了另外一个变量的地址, 实现对变量的间接访问。而在数组中保存了相同类型的数据, 可以通过数组的下标法对数组中元素进行直接访问。当指针指向一串连续的存储单元时, 并且连续的存储单元存放相同类型的数据, 可以通过指针和数组名对存储单元存放的数据进行访问。

2.1 指针与一维数组关系

指针与一维数组可通过指向数组元素的指针进行关联, 即通过定义数组元素类型的指针, 并将指针指向一维数组的首元素。假定p为已定义的一个指向整型数据的指针变量, 并已给它赋了一个整型数组a的首地址, 使它指向该数组的首个元素a[0]。按C语言规定, 如果变量p已指向一个数组元素, 则p+1指向同一数组中的下一个元素, 则指针p与一维数组a有图1所示关系。

2.2 指针与多维数组关系

指针与多维数组的关系比较复杂, 使用起来更为灵活, 可以增加程序编写的灵活性。现以二维数组为例, 详细介绍指针与多维数组关系。假定程序中有数组定义:int a[3][4]={{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}}。由于二维数组在C语言中被认为是一个由多个一维数组组成的一维数组, a数组包含3行, 因此可被认为包含了三个元素a[0]、a[1]、a[2]的一维数组, 每个元素又是一个一维数组, 分别包含四个元素。此外, 二维数组在内存中按行主序方式占据一串连续的存储单元, 所以C语言建立指针与二维数组a的关联, 除了指向数组元素的指针, 还可采用以下两种方法。

1、数组指针。

数组指针是一个指向一维或者多维数组的指针。通过定义数组指针, 并给其赋值, 可实现数组与指针的关联。假定程序中有语句:int (*p) [4]=a, 定义p为数组指针, 并将二维数组名a赋给p。由于a数组可以被认为包含了三个元素的一维数组, 每个元素又是一个一维数组, 因此p指向一维数组a[0], p+i指向一维数组a[i], 可得出关系1:* (p+i) ==a[i]。

a[i]既然是一维数组名, 而C语言又规定了数组名代表数组首元素地址, 因此a[i]代表一维数组a[i]中第0列元素的地址, a[i]+j代表一维数组a[i]中j列元素的地址, 即&a[i][j], 可得出关系* (a[i]+j) ==a[i][j], 又从关系1可推出:* (* (p+i) +j) ==* (a[i]+j) , 所以* (* (p+i) +j) ==a[i][j]。即实现通过数组指针表示数组元素, 其关系如图2所示:

2、指针数组。

一个数组, 若其元素均为指针类型数据, 称为指针数组, 也就是说指针数组中的每一个元素都相当于一个指针变量。假定程序中有语句:int*p[3]={a[0], a[1], a[2]}, 表示定义了包含3个整型指针的数组, p的三个整型指针分别指向数组a[0], a[1], a[2]的首元素, 因此二维数组第0行第0个元素可表示为*p[0], 第0行第j个元素可表示为* (p[0]+j) , 第i行第j个元素可表示为* (p[i]+j) , 其关系如图3所示:

指针与高于二维的数组也可采用上述方法进行关联, 具体实现过程由于理解其来比较抽象, 在实际编程过程中也较少使用, 在这里不再做进一步说明。以上介绍了指针与数组关联的三种方式, 阐述了C语言中指针和数组密切关系。

3、数组与指针关系应用

在C语言程序设计中, 为了优化程序, 提高程序的运行效率, 可利用指针和数组的关系, 通过指针对数组元素的访问。如编程求一个3*3的矩阵转置。C语言中对矩阵进行处理需将矩阵中数据存放在二维数组中, 可采用相关算法对二维数组中元素进行交换求出原矩阵的转置矩阵。用指针引用数组元素, 首先要建立指针和数组的关联, 可通过指向数组元素的指针、数组指针和指针数组实现, 在这里由于篇幅有限, 仅采用数组指针建立关联。具体程序如下:

4、总结

指针及数组的使用是C语言的核心内容之一, 是C语言学习的难点。不能充分理解指针、数组及两者之间的关系, 就不能充分发挥C语言的效能。通过以上对C语言指针与数组关系的阐述, 应能正确使用指针与数组编写和分析C语言程序。

摘要:在C语言中指针和数组的关系密不可分, 本文通过探讨指针与数组关联的方法, 论述了C语言程序设计中指针与数组的几种常见关系, 最后给出了一个通过指针访问数组的实例, 很好的体现了指针与数组的关系。

关键词:指针,数组,C语言,程序设计

参考文献

[1].Kenneth A.Reek.C和指针[M].北京:人民邮电出版社, 2003.

[2].Brian W.Kernighan.C程序设计语言[M].北京:机械工业出版社, 2004年.

[3].谭浩强.C程序设计[M].北京:清华大学出版社, 2008.

[4].Eri R.Hanly.C语言详解[M].北京:人民邮电出版社, 2007.

大学C语言考试知识点 篇7

3./* example1.1

The first C Program*/ 注释文字 不影响程序本身 是程序员看的,方便日后修改 /* 注释文字 */

4.stdio.h 输入输出头文件

#include

编译预处理文件

作用是将stdio.h包含到我们的C程序里面来 5.main(){ }

主函数;任何一个C语言程序有且仅有一个主函数,所有程序代码都必须包含到主函数的{}里面去 ;

printf(“”);是一个输出函数;所有的需要的输出的内容都必须放在printf里面的””里面去

C语言里面的所有符号都必须是英文状态下的 关掉软件

热启动 ctrl+alt+del 调出任务管理器

系统暂停命令 system(“pause”);

在VC++6.0 C++的环境下,需要头文件 stdlib.h 在编程的时候需要加预处理#include 6.7.8.9.10..cpp是C++文件的源文件的标准后缀名

.c是C语言文件的源文件的标准后缀名,是高级语言;

.obj是C语言文件的目标文件的标准后缀名,是一种机器语言;.exe是C语言文件的可知性文件的标准后缀名;是一种机器语言; 11.signed int 类型所对应的格式字符是

%d unsigned int类型所对应的格式字符是 %u 12.标识符:由字母、数字、下划线组成;第一个字母必须是字母或者下划线;

不区分大小写;不能是关键字;

13.常量 :在整个程序的运行过程中,值不会改变的量

符号常量:用符号来常量的值

整型常量:

十进制——数学中普通整数的表示 数码0-9

123

格式字符%d

八进制——以0开头的八进制数 数码0—7

0123

格式字符%o

十六进制——以0x开头的十六进制数 数码0—9 a—f

0x123 格式字符 %x 实型常量:

十进制:只要有小数点

.123

123.float 格式字符%f double %lf

指数形式:包含了E或 e

注意 E、e的前后都必须有数字,后面的数字必须是整数

%e

字符型常量:以’’括起来的单个普通字符或者是转义字符

‘a’

‘n’

‘OOO’

‘xHH’

‘123’

‘x2a’

字符串常量:以””括起来的字符序列

“a”

“abd58ege,2dgd” 14.变量:在程序的运行过程中,其值可以改变的量

定义:

数据类型

变量名;

int

a;

赋值:a=15;

类型:

整型变量:int 变量名; int a;定义变量

a=3;变量赋值

实型变量: float 变量名;

double 变量名; 字符型变量:char 变量名;

没有字符串变量,只有字符串常量 15.运算符的优先级大致排行

!-> 算术运算符>关系运算符>逻辑运算符>赋值运算符>逗号运算符

表达式:含有运算符的式子称为表达式 运算符:

+* / % +=-= *= /= %= ++-

= 赋值运算符

其左边只能是单个变量

== 关系运算符

判断两边的值是否相等

如果相等为真,不等为假

?: 条件运算符

判断?前面的表达式,如果为真,就执行:前面的表达式;如果为假就执行:后面的

表达式1,表达式2,表达式3……

从左往右依次运算,最后表达式的值是整个逗号表达式的值 4. 输入函数

sanf();getchar()gets()5. 输出函数

Printf()Putchar()Puts();6.选择结构

条件表达式的值要么为真,要么为假

if(‘a’)

if(0)if(x=y)

if(x==y)当条件满足的时候,要执行的语句

If(条件表达式){ 语句1; 语句2; 语句3;…… } If(条件表达式)语句1; 语句2; …… 6. 循环结构

循环的四要素

循环结构的相互转换

循环结束的时候,循环变量的值 7. 数组

数组的定义 数组赋初值 数组的赋值

字符数组的赋值

数组的排序

8. 函数 9. 指针

int *p;int a;p=&a;*p=a;&*p=&a;10.结构体

c语言数组知识点 篇8

1,函数是从主函数(main())开始执行,回到主函数(main())结束;

2,一个程序的编译是从第一个函数(语句)开始,到最后一个函数(语句)结束; 第二章

1,算法的特性:有穷性,确定性,有一个或者0个输入,有一个或者多个输出;有效性

2,算法(程序)的几个结构:选择结构,顺序结构,循环结构 第三章

1,int类型是2个字节,float是4个字节,dooble是8个字节 2,数据类型分为:基本类型(整型,实型,字符型,枚举型),指针类型,构造类型(结构体类型,数组类型,共用体类型),空类型(空类型合法哦,不要忘记了这个特殊哦)

3,变量的地址是确定的,变量变的地方只是地址里面的值。4,用户标志符,由数字,字母,下划线构成,第一个不能是数字,但是32个关键字除外。

5,注意int的最大表示范围是-32768――+32767,当超过这个范围的时候,即以%d输出+32768时结果为-32768 6,长整形(long)表示方法是在数字后面加L,如果一个变量a=3,那么表示的是一个整形的3,如果是a=3L,那么就是长整形的3;当分别以%o,%ld,%x(8进制,长整形,16进制)输出的时候,结果没有前面的0,0X,和后面的L 例:int a=075,b=ox14;long int c=5L;

printf(‚%o,%x,%ld‛,a b c);结果为(75,14,5)

7,当出现’’的什么时候为结束,什么时候为八进制的转义字符: 当’’后面有1-7之间的数字的时候为转义字符;其他的时候为字符串结束标志,注意转义字符有哪些(参考书p8)

这样一个例题 若 strlen(‛abc89‛)=3 strlen(‚abc12‛)=4 8,强制转换不会改变一个变量的值,只是改变其作用的那个表达式的值。

9,++,――,当++,——,在变量后面的时候表示在本次运算的时候不会改变,在下次引用或者参与运算的时候才会自变;当++,――,在变量的前面的时候则是在本次运算就会发生自变(顺便掌握++,――结合性是右结合,若i+++j等价于(i++)+j; 10,复合运算符要注意当等号后面接的是表达式的时候要把表达式看成一个整体即x *=y+8等价于x=x*(y+8),y+8是一个整体 第四章

1,格式输入和输出的时候,注意格式。要严格按照题目的格式进行操作。(在做题的时候尤其是读程序写结果的时候要细心哈!)2,%d,%md,%m..nd, %e,以及相应的几种格式是什么意思,参考书p13 第五章

1,关系运算符,>,<,<=,>=,= =,!=,==和!=优先级最低,主意=与==的区别:=是赋值的意思,表达式的值是对变量赋的值,==是关系运算符,关系运算表达式的值为0或者1.2,逻辑运算符,&&,||,!在这几个中优先级!> && > ||,优先级是体现在结合性上而不是运算的先后性上。例如

a=b=c=1;d=++a||++b&&++c在这个里面&&最高那就是加粗部分先看成一个整体,运算顺序还是从++a开始,即做完这个运算后,可以依次判断出后边的运算式子没有必要计算了,所以d=1,a=2,b=1,c=1

1有else的情况是:if(表达式)语句; 3,if语句基本格式:○

2没有else的情况是:if(表达式)else语句;(注意有分号哦),○语句;当有多个if和else的时候if是与其后最近的没有配对的else结合;注意,当函数作为if里面的表达式的时候即if(printf(‚*‛))的时候,则是以函数的返回值判断if的真假,printf输出以1个字符则返回为1,所以这个if是真的;

4条件表达式,? : ;右结合性,是从右往左结合,即是以最后一个?开始结合,但是计算顺序仍然是从左到右(这个牵涉到++,--问题)(参考书p16)

5,switch语句,switch语句只有碰到break或者做到最后一个语句才结束,case和default语句都只是入口。(参考书p17页例子)第六章

1,while语句基本格式是while(表达式)语句;注意在while()后面没有;号,当函数或者赋值表达式放在while的()中时与if的判断方法一样,时候函数的返回值或表达式值的逻辑值; 2,do{ }while();语句和while语句的区别在于前者先做后判断后者是先判断后做,这个知识点多参考书上(p18例题)和卷子上的题

3,for语句,例如:for(i=1;i<100;i++)s=s+i;注意for括号的后面没有;号,当有两个for语句即嵌套的for循环的时候 例如:

for(i=1;i<4;i++)for(j=0;j<5;j++)

s=s+i;这个时候是先做i=0;然后判断i;然后做加粗的部分,即是把加粗部分看成一个整体做完之后才会回到i++;所以s=s+i;这个语句做了20次,(参考书p19例题)

4,总结if,for,whlie,后面如果没有{}的时候,即是只有一个简单的语句的时候,if,for,whlie的作用效力范围是到与之最近的分号结束;当有{ }的时候即是把{ }看成一个整体,控制范围是整个{ }里面的所有语句。5,break是结束整个循环;contine结束本层循环;具体参考书(p19页例子这个很重要哦,一定要掌握)第七章和第十章(重点哦!!!)

1,维数的判断,当*,[]前面有int,char,float等常见的类型名的时候表示是在定义,一个 * 或者[]表示升一维,当表达式前面没有int,char,float的时候则是在引用(或称为使用)一个*或者[ ]表示降一维;

2,注意这样一些东西:int a[3][3],**p=a则,a[0]等价于*p表示的是这个2维数组的第一行或者说是这个2维数组的首元素的地址;a[i]等价与*(p+i)都表示是数组的第i行或者是第i行的首元素的地址;所以要引用这个a数组的元素应该用a[i][j]或者**p 3,对一个数组的输入输出总结

当数组是int(整形的时候)

一个有n个元素的1维数组:输入 for(i=0;i

输出 for(i=0;i

printf(‚%d‛,a[i]);注意int类型要以%d的格式

一个有n行m列的2维数组:输入:for(i=0;i

for(j=0;j

输入:for(i=0;i

一个字符串数组即 char a[10];对这个的输入有两种方式

(1)for(i=0;i

(2)gets(a); scanf(‚%s‛,a)(注意这两种方式的括号里面的只能是一个数组名)

输出也对应有两种方式:(1),for(i=0;i

4,对一个有n个元素的数组的遍历(既是说从第一个成员访问到最后一个成员)有以下两种方式:

1,for(i=0;i

a[i];

(都是指从a[0]访问到a[n-1])a[i]; 参考书p31 5,对字符串的操作注意:sizeof是一个系统关键字,不是函数,求其后边的参数占用的内存空间,strlen 求字符串中有多少有效字符。

注意这个例题:char a[30]=‚abcb‛; sizeof(a)=30 ; sizeof(‚abcb‛)=6;

strlen(a)=3 strlen(‚abcb‛)=3 ;

6,*p++ 表达式中p与++先结合,取完值之后地址指向下一个元素的地址;*++p则是直接输出第二个元素,指针输出完之后,也指向了下一个元素的地址

7,char a[10]; while(a[i])和while(a[i]!=‘’)都是表示当a数组不结束的情况下继续循环,一般就是指访问整个数组 8,自编函数实现求字符串的长度:

int fun(char *a)int fun(char *s){ int k; { char *p;

p=s whlie(a[k])whlie(*p)k++;p++; retrun(k-1);} retrun(p-s);} 第八章

1,分清形参和实参的区别:(1)形参是在定义或声明中,实参是在引用当中;当函数名前有int,float,char等类型名时是定义或者声明,但是要排除省略类型名的情况;一般引用出现在主函数中,(2)形参是不确定的值,因此不能为常量,实参是确定的值所以可以为常量。

2,当实际参数是一个变量的时候,实参向形参传递值,只是个简单的值传递,不会改变实参的值;当是实参是地址传递的时候就要改变

例:(1),int sub(int x,int y)

{ int c=x;x=y;y=c;} void main()

{ int a=3,b=2;sub(a,b);

printf(‚%d,%d‛,a,b);} 结果是 3,2

(2),int sub(int* x,int *y)

{int c=*x;*x=*y;*y=c;} void main()

{int a=3,b=2;sub(&a,&b);

printf(‚%d,%d‛,a,b);} 结果是 2,3 3,局部变量和全局变量;注意分清各自的作用范围;参考书p64 第4题

局部变量:在程序中,只在特定的过程或函数中可以访问的变量,是相对与全局变量而言的。

全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。

局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。

4,注意形参和实参必须赋值兼容,也就是说形参和实参维数必须一样;注意区别viod和return;当主函数里面带参数的形式,main(int argc,char *argv[])中argc是表示参数的个数,argv这个数组储存的是具体的参数个数。例,void main(int argc,char *argv[]){ char **p;while(――argc)

{ *p=argv[argc]; puts(*p); } } 若输入为 china Beijing flie 则结果为:flie Beijing ;

5,注意函数的调用以及静态变量;参考各次卷子中关于这个方面的题

第九和十一章

1,宏替换的时候只是简单的字符替换,不要加任何东西,宏名中不能包含空格; 例:#define xx(m)m*m …… int i=5;

i=i+xx(4+5);

结果为 i=5+4+5*4+5=34;

2,宏替换是在预编译的时候进行,所以不占用程序运行时间;宏名是无类型的;

3,结构体变量的长度是各个成员长度的和;当结构体指针和数组的时候注意分清.和->的区别;参考书中p59第3题 4,共用体变量的长度是由成员中的最长的成员决定;

5,链表的题就掌握模拟考试题中的一道选择题就可以了;第十一章的其他内容,还是要去看书了解 第十二章和第十三章

1,位运算符有 |(或)即只要有一个1就是1,&(与)要全部为1才为1 ^(异或)要不相同才为1 ;注意的是当向左移动n位就是乘以2的n次方;向右移动n位就是除以2的n次方。2,文件,c语言中可以认识两种文件存储类型(1),文本文件(2),二进制文件;

3,打开文件操作注意语句 if((fp=fopen(‚文件名‛,‚r‛))==NULL);当等于NULL的时候就不能打开;注意文件打开之后必须关闭,即是fclose(fp);这两个必然是成对出现;

4,文件在什么情况下结束(1),fp==EOF的时候结束fp!=EOF的时候不结束。

(2),当feof(fp)返回值为0时不结束,返回非零时就是结束;

5,注意背下书p139第2题,万一考到文件的编程一般就是这种题。一般填空就是上面的加粗部分。

6,w,r,a分别表示对文本文件的读,写,追加;fputs(ch,fp)指将ch变量输出到文件fp中;ch=fgets(fp)指的是从文件中得到一个字符赋给变量ch;fread或fwrite(buffer,size,num,fp)中,buffer指的是文件读出/写入的数据的地址,是一个数组名或者指针;size,指读出或者写入每个数的字节数;num指读出和写入多少个数;fp指文件指针。编者的话:

这些只是基础知识的重点,目的是帮助大家复习基础知识(记住这个只是基础的一部分,仅仅是基础,各个基础知识的运用请大家多参考发的卷子和书后面的习题),大家还是争取要把书细细的看上2遍以上,最后祝大家都能顺利的过二级。

作者:好老师工作

c语言数组知识点 篇9

C语言教学中语法知识的讲授对学生扎实掌握C语言起着决定性作用。目前C语言教学中主要采用基于案例或程序的多媒体辅助教学方法[4]、任务驱动教学法和项目教学法等[5,6], 但对一些难点知识如果只采用案例、程序、任务或项目教学方法, 不进行深入的理论分析, 学生往往就会感觉知识内容太突兀, 难于理解与掌握, 从而失去学习的兴趣。

目前在多数C语言教材中普遍存在对数组多种访问形式的表述不够深入的问题, 特别是对于二维数组的多种访问形式, 因此在教学中往往存在教师难以讲透彻, 学生较难掌握该知识点的问题。本文应用数学思维, 对该知识点进行理论分析研究, 推导出了一维数组和二维数组访问形式的基本等价关系, 并采用理论分析与实例验证相结合的教学方法, 在教学实践中取得了较为理想的教学效果。

一、数学思维在C语言教学中的重要性

数学思维是人脑在和数学对象交互作用的过程中, 运用特殊的数学符号语言以抽象和概括为特点, 对客观事物按照数学自身的形式或规律做出的间接概括的反映[7]。在C语言的语法中, 处处闪烁着数学思维的火花, 比如基本数据类型中常量到变量的知识与数学中常数到代数的思想一致;运算符继承和发展了数学中的运算符;表达式与数学中的多项式类似;选择结构与数学中的分段函数类似;循环结构与数学中的多项式求和、求积等计算类似;数组与数学中的矩阵类似;函数与数学中的函数类似;等等。因此可以认为C语言是数学语言的另外一种表现形式, 充分借鉴数学思维进行C语言学习, 是一种高效的学习方法。

在C语言教学中, 强调C语言语法概念及语法形式, 同时强调其与数学语言的联系, 并借鉴数学思维, 能很好地激发学生自主利用数学思维进行C语言学习的兴趣, 使其对C语言学习充满自信, 产生触类旁通的感觉。当然, C语言毕竟不等同于数学语言, 其虽与数学语言有很大程度上的相似, 但也存在显著的不同, 比如运算符“/”在C语言中有两种用法, 而在数学中只有一种用法;C语言中有求余 (模) 运算符“%”, 而数学语言中却没有等。因此, 在C语言学习中, 既要借鉴数学思维来进行学习, 又要辨清C语言与数学语言的不同, 这是C语言学习中需要掌握的学习原则和方法。

二、数组多种访问形式的等价关系

1. 一维数组多种访问形式的等价关系。

设一维数组a, 整型指针变量p满足以下定义:

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

int*p=a;

(1) C语言中定义a的值为一维数组a的首个元素的地址, 则存在以下等价关系:

p<=>a<=>&a[0]

(2) 根据C语言中指针运算法则, 可得:

p+i<=>a+i<=>&a[i]<=>&p[i]

(3) 对 (2) 中各项进行取内容运算, 可得:

* (p+i) <=>* (a+i) <=>a[i]<=>p[i]

2. 二维数组多种访问形式的等价关系。

设二维数组a, 指向数组的整型指针变量p和整型指针变量q满足以下定义:

int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

int (*p) [4]=a;

int*q=a;

(1) 由C语言中定义a的值为二维数组a首行的地址, 则存在以下等价关系:

p<=>a<=>&a[0]

(2) 根据C语言中定义的指向数组指针的运算法则, 可得:

p+i<=>a+i<=>&a[i]<=>&p[i]

(3) 对 (2) 中各项进行取内容运算, 可得:

* (p+i) <=>* (a+i) <=>a[i]<=>p[i]

(4) C语言中定义ai]的值为二维数组a的第i行第0列元素的地址, 则存在以下等价关系:

a[i]<=>&a[i][0]

(5) 对 (3) 中各项再进行取内容运算, 结合 (4) 中等价关系, 可得:

** (p+i) <=>** (a+i) <=>*[a]<=>*p[i]<=>a[i][0]

(6) 根据C语言中定义二维数组元素的访问方法, 可得:

* (* (p+i) +j) <=>* (* (a+i) +j) <=>a[i][j]<=>p[i][j]

(7) 对于整型指针q, 根据指针运算法则及取内容运算符的运算法则, 可得以下3种等价关系:

q+4*i<=>a[i]<=>&a[i][0]

* (q+4*i) <=>*a[i]<=>a[i][0]

* (q+4*i+j) <=>a[i][j]

根据以上一维数组、二维数组访问形式的等价关系, 可以总结为: (1) 一维数组访问形式存在3种等价关系; (2) 二维数组访问形式也存在6种等价关系, 前3种等价关系与一维数组形式相同, 但含义不同, 在教学中要引起重视。

三、数组多种访问形式的教学方法

在具体数组多种访问形式教学时, 基于数学思维, 采用先理论分析, 后实例验证的方法。具体验证环境为windows XP操作系统, 编译器采用Visual C++6.0。

1. 一维数组多种访问形式的教学方法。先推导一维数组多种访问形式等价关系, 再给出如下验证实例程序:

编译连接后, 运行结果为:

12FF6C, 12FF6C, 12FF6C

12FF70, 12FF70, 12FF70, 12FF70

2, 2, 2, 2

结果验证:根据实验结果各行相等, 可验证一维数组的3种等价关系成立。

2. 二维数组多种访问形式的教学方法。先推导二维数组多种访问形式等价关系, 再给出如下验证实例程序:

编译连接后, 运行结果为:

12FF50, 12FF50, 12FF50

12FF60, 12FF60, 12FF60, 12FF60

12FF60, 12FF60, 12FF60, 12FF60

5, 5, 5, 5, 5

7, 7, 7, 7

12FF60, 12FF60

12FF60, 12FF60, 12FF60

5, 5, 5

7, 7

结果验证:根据实验结果各行相等, 可验证二维数组的9种等价关系成立。

四、结论与认识

C语言主体内容及其严密的逻辑性与数学语言有天然的一致性, 数学思维贯穿C语言学习的始终。在数组多种访问形式知识点的教学中, 采用理论分析与实例验证相结合的教学方法, 既突出了数学思维在C语言教学中的重要性, 又符合学生在学习新知识时类比学习方法最为有效的客观认知规律, 从而在教学实践中取得了较为理想的教学效果。

摘要:数学思维在C语言教学中有着重要意义。针对C语言教学中存在的学生较难掌握数组多种访问形式的问题, 应用数学思维方法, 推导一维数组和二维数组访问形式的基本等价关系, 并进行理论分析与实例验证相结合的教学方法的探讨, 在教学实践中取得了较为理想的教学效果。

关键词:数学思维,教学方法,C语言,数组,等价关系

参考文献

[1]谭浩强.C程序设计[M].北京:清华大学出版社, 2002:13.

[2]贾宗璞, 许合利.C语言程序设计[M].北京:人民邮电出版社, 2010:10.

[3]周汝雁, 韩彦岭, 张明华, 等.程序设计语言中较难理解算法的课堂教学方法[J].计算机教育, 2013, (6) :91-94.

[4]王光琼, 袁小艳, 梁弼.C程序设计课程教学方法探讨[J].四川文理学院学报, 2010, (2) :108-111.

[5]张季良.任务驱动教学法在独立学院计算机教学中的应用[J].计算机教育, 2007, (5) :46-48.

[6]张学林, 陈齐超, 段珊, 等.项目教学法在“C语言课程设计”中的研究与应用[J].实验技术与管理, 2011, (2) :164-167.

上一篇:开学第一天见闻作文600字下一篇:市委巡视工作汇报