请教C语言

栏目:资讯发布:2023-11-07浏览:1收藏

请教C语言,第1张

函数调用

1)注意在函数调用时实参和形参的个数、类型应一一对应。对实参表求值的顺序是不确定的,有的系统按自左至右,有的系统则按自右至左的顺序。这一点要注意。

2)函数调用的方式:函数语句,函数表达式,函数参数

3)如果主调函数和被调函数在同一文件中,并且主调函数在前,那么一般要在主调函数中对被调函数进行说明。除非:(1)被调函数的返回值类型为整型或字符型(2)被调函数出现在主调函数之前。

4)对函数的说明和定义是不同的,定义是指对函数功能的确立,包括指定函数名,函数值类型,形参及其类型、函数体等。说明则只是对已定义的函数返回值类型进行说明,只包括函数名、函数类型以及一个空的括弧,不包括形参和函数体。

5)c语言允许函数的递归调用(在调用一个函数的过程中又出现直接或间接的调用该函数本身)。

变量的指针和指向变量的指针变量

读起来很拗口,说白了就是变量的地址和用来存放变量地址的地址变量。因为一个变量在编译的时候系统要为它分配一个地址,假如再用一个变量来存放这个地址,那么这个变量就叫做指向变量的指针变量,也就是用来存放变量地址的这么一个变量。所谓"指向"就是指存放××的地址,如指向变量的指针变量,"指向"就是指用来存放变量的地址,再如指向数组的指针变量,"指向"就是指存放数组的地址。只要理解了这个,指针也就不难了。另外,还有指向字符串的指针变量,指向函数的指针变量,指向指针的指针变量等。

1) 指针变量的定义

形式:类型标识符 标识符 如:int pointer;

要注意两点:表示pointer是个指针变量,在用这个变量的时候不能写成pointer, pointer是pointer指向的变量。一个指针变量只能指向同一个类型的变量。如上面

pointer只能指向int型变量。

2)指针变量的引用

两个有关的运算符:

& 取地址运算符 &a 就代表变量a的地址

指针运算符 a 就代表变量a的值

2. 数组的指针和指向数组的指针变量

数组的指针指数组的起始地址,数组元素的指针指数组元素的地址。

1)指向数组元素的指针变量的定义与赋值

定义和指向变量的指针变量定义相同,c规定数组名代表数组的首地址,即第一个数组元素地址。

2)通过指针引用数组元素

我们通常引用数组元素的形式是a[i],如果用指针可以这样引用,(a+i),或定义一个指针变量p,将数组a的首地址赋给p,p=a;然后用(p+i)引用。

注意:指针变量p指向数组a首地址,则p++指向数组a的下一元素地址,即a[1]的地址。

3)数组名作函数参数

形参数组和实参数组之间并不是值传递,而是共用同一段地址,所以在函数调用过程中如果形参的值发生变化,则实参的值也跟着变化。

4)指向多维数组的指针和指针变量

以二维数组为居多。假设定义了一个二维数组a[3][4],那么

a代表整个二维数组的首地址,也代表第0行的首地址,同时也是第0行第0列的元素的首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。

假设a是一个数组的首地址,那么如果a是一维的,a+I代表第I个元素的地址,如果a是二维的,则a+I代表第I行的首地址。

那么第一行第二列的元素地址如何表示呢?a[1]+2或&a[1][2]或(a+1)+2。

我们只要记住:在二维数组中a代表整个数组的首地址,a[I]代表第I行的首地址,a[I]与(a+I)等价就行了。只要运用熟练了就没什么复杂的了。

5)指向由m个整数组成的一维数组的指针变量

如:int (p)[4],p是一个指向包含4个元素的一维数组,如果p先指向a[0],则p+1指向a[1],即p的增值是以一维数组的长度为单位的,这里是4,举个例子:

假设a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},p先指向a[0]也就是数组a的首地址,那么p+1就是a[1]的首地址即元素9的地址,因为在定义p时int (p)[4],定义一维数组长度为4,所以p+1就等于加了一个一维数组的长度4。

3. 字符串的指针和指向字符串的指针变量

1)字符串的表示形式

c中字符串有两种表示形式:一种是数组,一种是字符指针

char string[]="I love c!";

char str="I love c!";

其实指针形式也是在内存中开辟了一个数组,只不过数组的首地址存放在字符指针变量str中,千万不要认为str是一个字符串变量。

2)字符串指针作函数参数

实际上字符串指针就是数组的首地址。

3)字符指针变量与字符数组的区别

① 字符数组由若干元素组成,每个元素存放一个字符,而字符指针变量只存放字符串的首地址,不是整个字符串

② 对数组初始化要用static,对指针变量不用。

③ 对字符数组赋值,只能对各个元素赋值,不能象下面这样:

char str[14];

str="I love c!";

对指针变量可以,

char str;

str="I love c!";

注意:此时赋给str的不是字符,而是字符串首地址。

④ 数组在定义和编译时分配内存单元,而指针变量定义后最好将其初始化,否则指针变量的值会指向一个不确定的内存段,将会破坏程序。如:

char a;

scanf( "%s", a );这种方法是很危险的,应该这样:

char a, str[10];

a = str;

scanf( "%s", a );这样字符指针就指向了一个确定的内存段。

⑤ 指针变量的值是可以改变的,而字符数组名所代表的字符串首地址却是不能改变的。

4. 函数的指针和指向函数的指针变量

一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针。函数名代表函数的入口地址,这一点和数组一样。我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。如:假设有一个求两者较大的函数如下:int max( int x, int y );

当我们调用这个函数时可以这样:

int c;

c=max( a, b );这是通常调用方法,其实我们可以定义一个函数指针,通过指针来调用,如:

int (p)(); //注意指向函数指针变量的定义形式

p=max; //此句就是将函数的入口地址赋给函数指针变量p

c=(p)( a, b );

有些朋友可能对(p)()不大理解,其实它的意思就是定义一个指向函数的指针变量p,p不是固定指向哪个函数的,而是专门用来存放函数入口地址的变量。在程序中把哪个函数的入口地址赋给它,它就指向哪个函数。但要注意,p不能象指向变量的指针变量一样进行p++,p-等无意义的操作。

既然p是一个指针变量,那么就可以作为函数的参数进行传递。其实函数的指针变量最常用的用途之一就是作为函数参数传递到其它函数。这也是c语言中应用的比较深入的部分了。

变量的指针和指向变量的指针变量

读起来很拗口,说白了就是变量的地址和用来存放变量地址的地址变量。因为一个变量在编译的时候系统要为它分配一个地址,假如再用一个变量来存放这个地址,那么这个变量就叫做指向变量的指针变量,也就是用来存放变量地址的这么一个变量。所谓"指向"就是指存放××的地址,如指向变量的指针变量,"指向"就是指用来存放变量的地址,再如指向数组的指针变量,"指向"就是指存放数组的地址。只要理解了这个,指针也就不难了。另外,还有指向字符串的指针变量,指向函数的指针变量,指向指针的指针变量等。

1) 指针变量的定义

形式:类型标识符 标识符 如:int pointer;

要注意两点:表示pointer是个指针变量,在用这个变量的时候不能写成pointer, pointer是pointer指向的变量。一个指针变量只能指向同一个类型的变量。如上面

pointer只能指向int型变量。

2)指针变量的引用

两个有关的运算符:

& 取地址运算符 &a 就代表变量a的地址

指针运算符 a 就代表变量a的值

2. 数组的指针和指向数组的指针变量

数组的指针指数组的起始地址,数组元素的指针指数组元素的地址。

1)指向数组元素的指针变量的定义与赋值

定义和指向变量的指针变量定义相同,c规定数组名代表数组的首地址,即第一个数组元素地址。

2)通过指针引用数组元素

我们通常引用数组元素的形式是a[i],如果用指针可以这样引用,(a+i),或定义一个指针变量p,将数组a的首地址赋给p,p=a;然后用(p+i)引用。

注意:指针变量p指向数组a首地址,则p++指向数组a的下一元素地址,即a[1]的地址。

3)数组名作函数参数

形参数组和实参数组之间并不是值传递,而是共用同一段地址,所以在函数调用过程中如果形参的值发生变化,则实参的值也跟着变化。

4)指向多维数组的指针和指针变量

以二维数组为居多。假设定义了一个二维数组a[3][4],那么

a代表整个二维数组的首地址,也代表第0行的首地址,同时也是第0行第0列的元素的首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。

假设a是一个数组的首地址,那么如果a是一维的,a+I代表第I个元素的地址,如果a是二维的,则a+I代表第I行的首地址。

那么第一行第二列的元素地址如何表示呢?a[1]+2或&a[1][2]或(a+1)+2。

我们只要记住:在二维数组中a代表整个数组的首地址,a[I]代表第I行的首地址,a[I]与(a+I)等价就行了。只要运用熟练了就没什么复杂的了。

5)指向由m个整数组成的一维数组的指针变量

如:int (p)[4],p是一个指向包含4个元素的一维数组,如果p先指向a[0],则p+1指向a[1],即p的增值是以一维数组的长度为单位的,这里是4,举个例子:

假设a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},p先指向a[0]也就是数组a的首地址,那么p+1就是a[1]的首地址即元素9的地址,因为在定义p时int (p)[4],定义一维数组长度为4,所以p+1就等于加了一个一维数组的长度4。

3. 字符串的指针和指向字符串的指针变量

1)字符串的表示形式

c中字符串有两种表示形式:一种是数组,一种是字符指针

char string[]="I love c!";

char str="I love c!";

其实指针形式也是在内存中开辟了一个数组,只不过数组的首地址存放在字符指针变量str中,千万不要认为str是一个字符串变量。

2)字符串指针作函数参数

实际上字符串指针就是数组的首地址。

3)字符指针变量与字符数组的区别

① 字符数组由若干元素组成,每个元素存放一个字符,而字符指针变量只存放字符串的首地址,不是整个字符串

② 对数组初始化要用static,对指针变量不用。

③ 对字符数组赋值,只能对各个元素赋值,不能象下面这样:

char str[14];

str="I love c!";

对指针变量可以,

char str;

str="I love c!";

注意:此时赋给str的不是字符,而是字符串首地址。

④ 数组在定义和编译时分配内存单元,而指针变量定义后最好将其初始化,否则指针变量的值会指向一个不确定的内存段,将会破坏程序。如:

char a;

scanf( "%s", a );这种方法是很危险的,应该这样:

char a, str[10];

a = str;

scanf( "%s", a );这样字符指针就指向了一个确定的内存段。

⑤ 指针变量的值是可以改变的,而字符数组名所代表的字符串首地址却是不能改变的。

4. 函数的指针和指向函数的指针变量

一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针。函数名代表函数的入口地址,这一点和数组一样。我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。如:假设有一个求两者较大的函数如下:int max( int x, int y );

当我们调用这个函数时可以这样:

int c;

c=max( a, b );这是通常调用方法,其实我们可以定义一个函数指针,通过指针来调用,如:

int (p)(); //注意指向函数指针变量的定义形式

p=max; //此句就是将函数的入口地址赋给函数指针变量p

c=(p)( a, b );

有些朋友可能对(p)()不大理解,其实它的意思就是定义一个指向函数的指针变量p,p不是固定指向哪个函数的,而是专门用来存放函数入口地址的变量。在程序中把哪个函数的入口地址赋给它,它就指向哪个函数。但要注意,p不能象指向变量的指针变量一样进行p++,p-等无意义的操作。

既然p是一个指针变量,那么就可以作为函数的参数进行传递。其实函数的指针变量最常用的用途之一就是作为函数参数传递到其它函数。这也是c语言中应用的比较深入的部分了。

最后面的程序题是一般文件操作。这种程序题,需要编译运行,编译连接后,只是运行后出来的黑框框没有任何显示,是因为它都在文件中操作了,但是这个运行却是必不可少至关重要。

1计算机二级C语言考试的流程:

1)笔试:90分钟,满分100分,其中含公共基础知识部分的30分。

2)上机操作:90分钟,满分100分。

上机操作包括:

(1) 基本操作。

(2) 简单应用。

(3) 综合应用。

2计算机二级C语言考试内容 :

一、C语言程序的结构

1程序的构成,main函数和其他函数。

2头文件,数据说明,函数的开始和结束标志以及程序中的注释。

3源程序的书写格式。

4C语言的风格。

二、数据类型及其运算

1C的数据类型(基本类型,构造类型,指针类型,无值类型)及其定义方法。

2C运算符的种类、运算优先级和结合性。

3不同类型数据间的转换与运算。

4C表达式类型(赋值表达式,算术表达式,关系表达式,逻辑表达式,条件表达式,逗号表达式)和求值规则。

三、基本语句

1表达式语句,空语句,复合语句。

2输入输出函数的调用,正确输入数据并正确设计输出格式。

四、选择结构程序设计

1用if语句实现选择结构。

2用switch语句实现多分支选择结构。

3选择结构的嵌套。

五、循环结构程序设计

1for循环结构。

2while和do-while循环结构。

3continue语句break语句。

4循环的嵌套。

六、数组的定义和引用

1一维数组和二维数组的定义、初始化和数组元素的引用。

2字符串与字符数组。

七、函数

1库函数的正确调用。

2函数的定义方法。

3函数的类型和返回值。

4形式参数与实在参数,参数值的传递。

5函数的正确调用,嵌套调用,递归调用。

6局部变量和全局变量。

7变量的存储类别(自动,静态,寄存器,外部),变量的作用域和生存期。

八、编译预处理

1宏定义和调用(不带参数的宏,带参数的宏)。

2“文件包含”处理。

九、指针

1地址与指针变量的概念,地址运算符与间址运算符。

2一维。二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义。通过指针引用以上各类型数据。

3用指针作函数参数。

4返回地址值的函数。

5指针数组,指向指针的指针。

十、结构体(即“结构”)与共同体(即:“联合”)

1用typedef说明一个新类型。

2结构体和共用体类型数据的定义和成员的引用。

3通过结构体构成链表,单向链表的建立,结点数据的输出、删除与插入。

十一、位运算

1位运算符的含义和使用。

2简单的位运算。

十二、文件操作

只要求缓冲文件系统(即高级磁盘I/O系统),对非标准缓冲文件系统(即低级磁盘I/O系统)不要求。

1文件类型指针(FILE类型指针)。

2文件的打开与关闭(fopen,fclose)。

3文件的读写(fputc,fgetc,fputs,fgets,fread,fwrite,fprintf,fscanf函数的应用),文件的定位(rewind,fseek函数的应用)。

二级考试C语言程序设计题没有步骤分,只有零分和满分。

扩展资料

全国计算机二级C语言考试,分为选择题(40分),程序填空题 (18分),程序修改题 (18分),程序设计题(24分)。

考试内容

一、C 语言程序的结构

1 程序的构成,main 函数和其他函数。

2 头文件,数据说明,函数的开始和结束标志以及程序中的注释。

3 源程序的书写格式。

4 C 语言的风格。

二、数据类型及其运算

1C 的数据类型(基本类型,构造类型,指针类型,无值类型)及其定义方法。

2 C 运算符的种类、运算优先级和结合性。

3 不同类型数据间的转换与运算。

4 C 表达式类型(赋值表达式,算术表达式,关系表达式,逻辑表达式,条件表达式,逗号表达式)和求值规则。

三、基本语句

1 表达式语句,空语句,复合语句。

2 输入输出函数的调用,正确输入数据并正确设计输出格式。

四、选择结构程序设计

1 用 if 语句实现选择结构。

2 用 switch 语句实现多分支选择结构。

3 选择结构的嵌套。

五、循环结构程序设计

1 for 循环结构。

2 while 和 do-while 循环结构。

3 continue 语句和 break 语句。

4 循环的嵌套。

六、数组的定义和引用

1 一维数组和二维数组的定义、初始化和数组元素的引用。

2 字符串与字符数组。

七、函数

1 库函数的正确调用。

2 函数的定义方法。

3 函数的类型和返回值。

4 形式参数与实际参数,参数值的传递。

5 函数的正确调用,嵌套调用,递归调用。

6 局部变量和全局变量。

7 变量的存储类别(自动,静态,寄存器,外部),变量的作用域和生存期。

八、编译预处理

1 宏定义和调用(不带参数的宏,带参数的宏)。

2 “文件包含”处理。

九、指针

1 地址与指针变量的概念,地址运算符与间址运算符。

2 一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义。通过指针引用以上各类型数据。

3 用指针作函数参数。

4 返回地址值的函数。

5 指针数组,指向指针的指针。

十、结构体(即“结构”)与共同体(即“联合”)

1 用 typedef 说明一个新类型。

2 结构体和共用体类型数据的定义和成员的引用。

3 通过结构体构成链表,单向链表的建立,结点数据的输出、删除与插入。

十一、位运算

1 位运算符的含义和使用。

2 简单的位运算。

十二、文件操作

只要求缓冲文件系统(即高级磁盘 I / O 系统),对非标准缓冲文件系统(即低级磁盘 I / O 系统)不要求。

1 文件类型指针(FILE 类型指针)。

2 文件的打开与关闭(fopen,fclose)。

3 文件的读写(fputc,fgetc,fputs,fgets,fread,fwrite,fprintf,fscanf 函数的应用),文件的定位(rewind,fseek 函数的应用)。

以下是使用递归方法实现将输入字符串按反序输出的 C 语言程序:

```c

#include <stdioh>

// 递归函数,将字符串 str 按反序输出

void printReverse(char str) {

if (str == '\0') { // 判断是否到达字符串结尾

return;

} else {

printReverse(str + 1); // 递归调用,输出下一个字符

printf("%c", str); // 输出当前字符

}

}

int main() {

char str[100];

printf("请输入一个字符串:");

scanf("%s", str);

printf("反序输出字符串:");

printReverse(str);

printf("\n");

return 0;

}

```

在上述代码中,我们首先定义了一个递归函数 `printReverse`,该函数接受一个指向字符串的指针作为参数。在函数内部,我们首先判断当前指针所指向的字符是否为字符串结尾,如果是,则直接返回;否则,我们递归调用该函数,并传入指向下一个字符的指针,以实现按反序输出字符串。最后,我们输出当前字符。

在 `main()` 函数中,我们首先使用 `scanf()` 函数获取用户输入的字符串,并将其保存到字符数组 `str` 中。然后,我们调用 `printReverse()` 函数,并传入指向字符串开头的指针,以开始递归输出过程。最后,我们在输出结束后添加换行符,以使输出更加美观。

需要注意的是,在实际应用中,递归函数可能会导致栈溢出等问题,因此需要控制递归深度,以确保程序的健壮性和安全性。另外,也可以使用其他方法(如循环)来实现字符串反转的算法。

11 C抖语言发展概述

111 C++语言产生的背景

112 C++语言的发展

12 面向对象的程序设计方法概述

121 传统的结构化程序设计

122 面向对象的程序设计

123 面向对象的程序设计方法

13 面向对象的程序设计特征

131 抽象

132 类

133 封装

134 继承

135 多态

14 C++语言的语法规则与书写格式

141 C++标识符与关键字

142 C++程序结构的特点

143 C++的语法规则与书写格式

144 简单的C++程序设计范例

小结

习题与练习 21 C++的基本数据类型

211 整型数据类型

212 浮点型数据类型

213 字符数据类型

214 逻辑数据类型

215 空数据类型

22 常量

221 常量定义

222 数值常量

223 字符与字符串常量

23 变量、变量的存储类型与作用域

231 变量定义

232 变量的作用域

233 变量的存储类型

234 内部变量和外部变量

24 C++的数据类型转换

241 自动数据类型转换

242 强制数据类型转换

25 C抖的自定义数据类型

小结

习题与练习 31 C++运算符

311 算术运算符

312 关系运算符

313 逻辑运算符

314 位操作运算符

315 自增(减)运算符

316 赋值与复合运算符

317 其他运算符与运算符优先级

32 C++表达式

321 C++表达式的种类

322 使用表达式时应注意的事项

33 编译预处理

331 文件包含

332 条件编译

333 宏定义

334 带参数的宏定义

34 C++语句概述

341 复合语句

342 表达式语句与空语句

35 C++的输入、输出简介

351 C++语言的输入与输出

352 C++输出控制格式

小结

习题与练习 41 C++的控制结构概述

42 选择控制结构

421 二分支控制结构

422 if语句的应用

423 多分支控制结构

424 switch语句的应用

43 循环控制结构

431 while循环语句

432 while循环语句应用

433 for循环语句

434 for循环语句应用

435 do while循环语句

436 do while循环语句应用

437 三种循环语句的比较

438 多重循环

439 三种循环语句的混合嵌套应用

44 转向控制语句

441 break语句

442 continue语句

443 break语句与continue语句的比较

444 return语句

445 go to语句

45 控制语句的应用

小结

习题与练习题 51 枚举数据类型

511 枚举数据类型的定义与枚举变量

512 枚举类型变量的赋值

52 联合数据类型

521 联合数据类型及联合变量的定义

522 联合数据类型的特点与应用

53 结构数据类型

531 结构数据类型定义的一般格式

532 结构类型变量的定义与应用

54 数组变量与字符串

541 一维数组变量

542 一维数组变量的应用

543 二维数组变量

544 二维数组变量的应用

545 字符型数组变量

546 数组变量的存储

547 字符数组与字符函数

55 数组变量与结构变量

56 指针数据类型

561 指针变量

562 指针数据类型的基本概念

563 变量的引用

564 无类型指针

565 指针变量与数组变量

566 指向指针的指针

小结

习题与练习 61 函数的定义

611 函数定义

612 函数的声明

613 函数的形参与实参

62 函数的调用

621 函数调用的方式

622 函数的传值调用

623 函数的传址调用

624 函数的引用调用

63 函数的默认参数

64内部函数与外部函数

641 内部函数

642 外部函数

65 标识符的作用域

651 作用域的种类

652 标识符作用域的规定

66 函数运算结果的返回方式

661 用全局变量返回函数的运算结果

662 用return语句返回函数的运算结果

663 用参数返回函数运算结果

67 内联函数

671 内联函数的定义与使用

672 内联函数与带参宏的区别

68 重载函数

69 函数嵌套调用与递归调用

691 函数嵌套调用

692 函数递归调用

610 函数与数组

6101 形参与实参使用数组

6102 形参使用指针、实参使用数组

611 函数与指针

6111 指针作函数的参数

6112 指针函数

6113 函数指针

6114 函数指针数组

612 复杂数据类型的识别方法

613 函数模板

6131 函数模板的概念

6132 函数模板的定义与使用

6133 函数模板的应用

614 函数应用

小结

习题与练习

请教C语言

函数调用 1)注意在函数调用时实参和形参的个数、类型应一一对应。对实参表求值的顺序是不确定的,有的系统按自左至右,有的系统则按自右...
点击下载
热门文章
    确认删除?
    回到顶部