c语言 void swap,C语言的swap函数的易错点

本文详细分析了四个C语言程序,它们试图交换两个变量的值。程序一和二由于没有正确传递变量地址导致交换失败;程序三通过值传递无法改变原始变量;程序四通过指针成功交换了字符串。总结了交换变量值的正确方法,并对比了不同方法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序一:交换值

#include

void swap(int *x , int *y){

int *temp;

temp = x;

x = y;

y = temp;

}

void main(){

int a = 1;

int b = 2;

swap(&a , &b);

}

对于程序一,在它运行完成之后,a,b的值并没有发生变化。

原因是swap函数里面的x,y都是形参,函数里面对形参的地址进行了交换,这并没有交换main函数中的a,b这两个变量指向的地址。

程序二:交换值

#include

void swap(int *x , int *y){

int *temp;

temp = x;

x = y;

y = temp;

}

void main(){

int *a = 1;

int *b = 2;

swap(a , b);

}

程序二也不能交换a,b所指向的值,原因类似于程序一的错误原因。

程序三:交换值

#include

void swap(int x , int y){

int temp;

temp = x;

x = y;

y = temp;

}

void main(){

int a = 1;

int b = 2;

swap(a , b);

}

程序三运行完之后,a,b的值也没有发生交换,是因为swap函数中的形参x,y发生了值的交换,而并不是main中实参的值交换。

程序四:交换字符串

#include

void swap(char **x , char **y){

char *temp;

temp = *x;

*x = *y;

*y = temp;

}

void main(){

char *a = "china";

char *b = "hello";

swap(&a , &b);

}

程序四可以交换两个字符串,其原理如下图所示:

bVbE8vp

程序五:交换字符串

#include

#include

void swap(char *x , char *y){

char temp[10];

strcpy(temp,x);

strcpy(x,y);

strcpy(y,temp);

}

void main(){

char a[10] = "china";

char b[10] = "hello";

swap(a , b);

}

程序五也可以交换两个字符串,运用到了strcpy函数。

<think>嗯,用户让我介绍一下C语言专升本的知识大全,我得先理清楚专升本考试中C语言通常覆盖哪些内容。首先,我需要确定用户的需求是什么。他们可能是准备参加专升本考试的学生,需要系统的复习资料,或者他们可能对C语言的基础知识不够熟悉,想通过整理知识来加强学习。 接下来,我要考虑专升本考试的考试范围和重。通常这类考试会涵盖C语言的基础语法、流程控制、数组、函数、指针、结构体、文件操作等。可能还包括一些基本的算法和编程题。需要确保每个知识都全面,但不过于深入,毕竟专升本考试可能更侧重基础和应用。 然后,我需要分模块来组织这些知识。比如,可以分为基础语法、流程控制、数组、函数、指针、结构体与共用体、文件操作、动态内存管理、预处理指令、常见算法举例等部分。每个部分需要简明扼要地解释关键概念,并给出例子,这样用户更容易理解。 还要注意易错和考试重。例如,指针和数组的关系、函数参数传递的方式(值传递和地址传递的区别)、内存管理中的malloc和free使用等,这些都是学生容易出错的地方,需要特别强调。 另外,用户可能希望知识不仅全面,还要有针对性,可能涉及一些典型的例题或编程题。比如,排序算法、斐波那契数列、字符串处理等常见题目,这些在考试中出现的概率较高,应该包括进去。 同时,考虑到用户可能需要复习资料的结构清晰,便于记忆和复习,所以需要用列表或者分的方式呈现,每个知识下给出简要说明和示例代码片段,但不需要完整的程序,这样既节省篇幅,又突出重。 还需要注意术语的准确性,避免出现错误的概念,比如区分“=”和“==”的不同,指针和地址的关系,数组名作为指针常量等。这些细节对于考试来说非常重要,一旦理解错误可能导致编程题失分。 最后,我应该总结一下,提醒用户多练习真题,理解概念而不是死记硬背,特别是注重编程题的实践,因为考试中可能会要求编写或调试程序。此外,可能还需要推荐一些参考书目或在线资源,帮助用户进一步巩固知识。 在整理过程中,可能会遇到不确定的知识,比如预处理指令的具体应用或者动态内存管理的常见错误,这时需要查阅可靠的资料来确认,确保提供的信息准确无误。同时,要注意语言的口语化,让解释更易懂,避免过于学术化的表达,符合用户的学习习惯。 总之,整理C语言专升本知识需要全面覆盖考纲内容,结构清晰,重突出,结合实例,并指出常见错误,帮助用户高效复习,顺利通过考试。</think>以下是针对 **C语言专升本考试** 的核心知识整理,涵盖考试重易错,帮助高效复习: --- ### **一、基础语法** 1. **程序结构** - `#include <stdio.h>`:头文件包含 - `main()` 函数是程序入口,必须有且仅有一个。 - 语句以 `;` 结束,代码块用 `{}` 包裹。 2. **数据类型** - 基本类型:`int`, `float`, `double`, `char`。 - 类型修饰符:`short`, `long`, `unsigned`(如 `long int`)。 - **易错**:`int a = 3.14;` 会隐式转换为 `3`(丢失精度)。 3. **运算符** - 算术运算符:`+`, `-`, `*`, `/`, `%`(取模只能用于整数)。 - 关系运算符:`==`, `!=`, `>`, `<`, `>=`, `<=`。 - 逻辑运算符:`&&`, `||`, `!`。 - 赋值运算符:`=`, `+=`, `-=` 等。 - **优先级**:算术 > 关系 > 逻辑 > 赋值。 --- ### **二、流程控制** 1. **分支语句** - `if-else`:注意 `else` 匹配最近的 `if`。 - `switch-case`:需用 `break` 跳出,否则会继续执行后续 `case`。 ```c switch (a) { case 1: printf("1"); break; // 不加break会执行case 2 case 2: printf("2"); break; } ``` 2. **循环语句** - `for`:`for(初始化; 条件; 增量)`。 - `while`:先判断条件再执行。 - `do-while`:至少执行一次循环体。 - **重**:循环嵌套与跳出(`break` 结束整个循环,`continue` 跳过本次)。 --- ### **三、数组** 1. **一维数组** - 定义:`int arr[5];`,下标从 `0` 开始。 - 初始化:`int arr[3] = {1, 2, 3};` 或部分初始化(未赋值元素为0)。 - **易错**:数组越界(如访问 `arr[5]` 可能引发错误)。 2. **二维数组** - 定义:`int arr[2][3];`,按行存储。 - 初始化:`int arr[2][3] = {{1,2,3}, {4,5,6}};`。 --- ### **四、函数** 1. **函数定义与调用** - 函数声明:`返回值类型 函数名(参数列表);` - 参数传递:**值传递**(形参修改不影响实参) vs **地址传递**(指针可修改实参)。 - **递归调用**:重掌握阶乘、斐波那契数列等简单递归。 ```c void swap(int *a, int *b) { // 地址传递 int temp = *a; *a = *b; *b = temp; } ``` --- ### **五、指针** 1. **指针基础** - 定义:`int *p;`,`p` 存储变量的地址。 - 取地址符 `&`:`p = &a;`。 - 解引用符 `*`:`*p = 10;` 修改 `a` 的值。 2. **指针与数组** - 数组名是首元素地址:`int arr[3];` → `arr == &arr[0]`。 - 指针遍历数组:`for(p = arr; p < arr+3; p++)`。 --- ### **六、结构体与共用体** 1. **结构体** - 定义与使用: ```c struct Student { char name[20]; int age; }; struct Student stu1 = {"Tom", 18}; ``` 2. **共用体** - 所有成员共享同一内存空间,大小由最大成员决定。 --- ### **七、文件操作** 1. **文件打开与关闭** - `FILE *fp = fopen("file.txt", "r");` - 模式:`r`(读)、`w`(写)、`a`(追加)、`r+`(读写)。 - 关闭文件:`fclose(fp);`。 2. **读写函数** - `fprintf(fp, "%d", a);` 写入文件。 - `fscanf(fp, "%d", &a);` 读取文件。 --- ### **八、动态内存管理** - `malloc`:`int *p = (int*)malloc(5 * sizeof(int));` - `free`:释放内存 `free(p);` - **易错**:未释放内存导致内存泄漏。 --- ### **九、预处理指令** - `#define` 定义宏: ```c #define MAX(a,b) ((a) > (b) ? (a) : (b)) // 注意括号避免优先级错误 ``` - `#include`:包含头文件。 --- ### **十、常见算法举例** 1. **排序算法**:冒泡排序、选择排序。 2. **查找算法**:顺序查找、二分查找。 3. **递归应用**:斐波那契数列、汉诺塔问题。 --- ### **备考建议** 1. **刷真题**:重练习编程题和程序填空题。 2. **理解概念**:如指针与地址的关系、函数传参方式。 3. **手写代码**:避免依赖IDE,提升代码调试能力。 **推荐练习**:字符串逆序、求素数、链表基本操作(如果考纲涉及数据结构)。 希望这份整理能帮助你系统复习!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值