《C语言》指针练习题–1
1. 交换两个整数的值
题目描述:
编写一个C程序,定义一个函数swap
,使用指针参数交换两个整数的值。在main
函数中调用该函数并输出交换后的结果。
解题思路:
为了交换两个整数的值,可以通过指针传递它们的地址给函数swap
。在函数内部,通过解引用指针来交换两个变量的值。这样可以直接修改main
函数中变量的值。
程序流程如下:
- 定义函数
swap
,接受两个整数指针作为参数。 - 在
swap
函数中,使用临时变量交换两个指针指向的值。 - 在
main
函数中,声明两个整数变量并初始化。 - 打印交换前的值。
- 调用
swap
函数,传递变量的地址。 - 打印交换后的值。
详细代码:
#include <stdio.h>
// 定义函数swap,交换两个整数的值
void swap(int *a, int *b) {
int temp = *a; // 使用临时变量存储*a的值
*a = *b; // 将*b的值赋给*a
*b = temp; // 将临时变量的值赋给*b
}
int main() {
int num1, num2;
// 提示用户输入两个整数
printf("请输入第一个整数: ");
scanf("%d", &num1);
printf("请输入第二个整数: ");
scanf("%d", &num2);
// 打印交换前的值
printf("交换前: num1 = %d, num2 = %d\n", num1, num2);
// 调用swap函数交换num1和num2的值
swap(&num1, &num2);
// 打印交换后的值
printf("交换后: num1 = %d, num2 = %d\n", num1, num2);
return 0;
}
代码注释:
void swap(int *a, int *b)
:定义一个名为swap
的函数,接受两个整数指针作为参数。int temp = *a;
:通过解引用指针a
,将其指向的值存储在临时变量temp
中。*a = *b;
:将指针b
指向的值赋给指针a
指向的位置,实现部分交换。*b = temp;
:将临时变量的值赋给指针b
指向的位置,完成交换。在
main
函数中:
- 使用
&num1
和&num2
将变量的地址传递给swap
函数。 - 交换前后打印变量的值,验证交换是否成功。
- 使用
2. 计算数组元素的平均值
题目描述:
编写一个C程序,定义一个函数calculateAverage
,接受一个整数数组和其大小,返回数组元素的平均值。在main
函数中调用该函数并输出结果。
解题思路:
函数calculateAverage
通过遍历数组,累加所有元素的值,然后除以数组的大小,计算出平均值。使用指针可以更高效地访问数组元素。
程序流程如下:
- 定义函数
calculateAverage
,接受一个整数数组和其大小作为参数。 - 在函数中,使用指针遍历数组,累加元素的值。
- 计算并返回平均值。
- 在
main
函数中,声明一个整数数组并初始化。 - 调用
calculateAverage
函数,传递数组和大小。 - 输出平均值。
详细代码:
#include <stdio.h>
// 定义函数calculateAverage,返回数组元素的平均值
double calculateAverage(int *arr, int size) {
int sum = 0;
for(int i = 0; i < size; i++) {
sum += *(arr + i); // 使用指针访问数组元素
}
return (double)sum / size; // 计算平均值
}
int main() {
int numbers[5];
int size = 5;
double average;
// 提示用户输入5个整数
printf("请输入5个整数:\n");
for(int i = 0; i < size; i++) {
scanf("%d", &numbers[i]);
}
// 调用calculateAverage函数计算平均值
average = calculateAverage(numbers, size);
// 输出平均值
printf("数组元素的平均值是 %.2lf。\n", average);
return 0;
}
代码注释:
double calculateAverage(int *arr, int size)
:定义一个函数,接受一个整数数组的指针和数组的大小,返回平均值。sum += *(arr + i);
:通过指针运算访问数组的第i
个元素,并累加到sum
中。(double)sum / size
:将sum
转换为double
类型后,除以size
,得到平均值。在
main
函数中:
- 声明并初始化一个大小为5的整数数组
numbers
。 - 使用
for
循环读取用户输入的5个整数。 - 调用
calculateAverage
函数,传递数组名(数组名作为指针)和数组大小。 - 输出计算得到的平均值。
- 声明并初始化一个大小为5的整数数组
3. 动态内存分配与释放
题目描述:
编写一个C程序,使用指针动态分配内存来存储一个整数数组。提示用户输入数组的大小和元素,计算数组元素的总和,最后释放分配的内存。
解题思路:
使用malloc
函数动态分配所需大小的内存,并通过指针访问和存储数组元素。完成操作后,使用free
函数释放内存,避免内存泄漏。
程序流程如下:
- 声明一个指向整数的指针。
- 提示用户输入数组的大小。
- 使用
malloc
分配内存。 - 检查内存是否分配成功。
- 提示用户输入数组元素,并通过指针存储。
- 遍历数组,计算总和。
- 输出总和。
- 使用
free
释放分配的内存。
详细代码:
#include <stdio.h>
#include <stdlib.h> // 包含malloc和free函数
int main() {
int *arr;
int n;
int sum = 0;
// 提示用户输入数组大小
printf("请输入数组的大小: ");
scanf("%d", &n);
// 动态分配内存
arr = (int *)malloc(n * sizeof(int));
if(arr == NULL) { // 检查内存是否分配成功
printf("内存分配失败。\n");
return 1; // 非正常退出
}
// 提示用户输入数组元素
printf("请输入 %d 个整数:\n", n);
for(int i = 0; i < n; i++) {
scanf("%d", arr + i); // 使用指针访问数组元素
}
// 计算总和
for(int i = 0; i < n; i++) {
sum += *(arr + i);
}
// 输出总和
printf("数组元素的总和是 %d。\n", sum);
// 释放内存
free(arr);
printf("内存已释放。\n");
return 0;
}
代码注释:
#include <stdlib.h>
:包含malloc
和free
函数的库。int *arr;
:声明一个指向整数的指针,用于动态分配内存。arr = (int *)malloc(n * sizeof(int));
:动态分配n
个整数所需的内存,并将地址赋给arr
。if(arr == NULL)
:检查内存分配是否成功,若失败则输出错误信息并退出。scanf("%d", arr + i);
:通过指针运算访问数组元素,存储用户输入的值。sum += *(arr + i);
:通过指针运算访问数组元素并累加到sum
中。free(arr);
:释放动态分配的内存,避免内存泄漏。
4. 字符串处理与指针
题目描述:
编写一个C程序,定义一个函数toUpperCase
,接受一个字符串指针,将字符串中的所有小写字母转换为大写字母。在main
函数中调用该函数并输出结果。
解题思路:
函数toUpperCase
通过遍历字符串,检查每个字符是否为小写字母。如果是,则将其转换为大写字母。使用指针可以直接修改字符串中的字符。
程序流程如下:
- 定义函数
toUpperCase
,接受一个字符指针作为参数。 - 在函数中,遍历字符串,使用ASCII值将小写字母转换为大写字母。
- 在
main
函数中,声明一个字符数组并初始化。 - 打印转换前的字符串。
- 调用
toUpperCase
函数,传递字符串的指针。 - 打印转换后的字符串。
详细代码:
#include <stdio.h>
#include <ctype.h> // 包含toupper函数
// 定义函数toUpperCase,转换字符串中的小写字母为大写字母
void toUpperCase(char *str) {
while(*str != '\0') { // 遍历字符串直到结束符
if(islower(*str)) { // 检查是否为小写字母
*str = toupper(*str); // 转换为大写字母
}
str++; // 移动指针到下一个字符
}
}
int main() {
char str[100];
// 提示用户输入一个字符串
printf("请输入一个字符串: ");
fgets(str, sizeof(str), stdin);
// 去除换行符
for(int i = 0; str[i] != '\0'; i++) {
if(str[i] == '\n') {
str[i] = '\0';
break;
}
}
// 打印转换前的字符串
printf("转换前的字符串: %s\n", str);
// 调用toUpperCase函数转换字符串
toUpperCase(str);
// 打印转换后的字符串
printf("转换后的字符串: %s\n", str);
return 0;
}
代码注释:
#include <ctype.h>
:包含字符处理函数,如islower
和toupper
。void toUpperCase(char *str)
:定义一个函数,接受一个字符指针,遍历并转换字符串中的小写字母。if(islower(*str))
:检查当前字符是否为小写字母。*str = toupper(*str);
:将小写字母转换为大写字母。在
main
函数中:
- 使用
fgets
读取用户输入的字符串,包括空格。 - 遍历字符串,遇到
\n
则替换为\0
,去除换行符。 - 调用
toUpperCase
函数,传递字符串的指针。 - 输出转换前后字符串的内容。
- 使用
5. 指针与数组的关系
题目描述:
编写一个C程序,定义一个整数数组和一个指针指向该数组的第一个元素。使用指针遍历数组并打印所有元素的值。
解题思路:
在C中,数组名实际上是指向数组第一个元素的指针。通过指针运算,可以遍历数组中的所有元素。程序流程如下:
- 声明并初始化一个整数数组。
- 声明一个指针,并指向数组的第一个元素。
- 使用指针遍历数组,打印每个元素的值。
- 通过指针加法或递增指针来访问下一个元素。
详细代码:
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr; // 指针指向数组的第一个元素
// 使用指针遍历数组并打印元素
printf("数组元素为:\n");
for(int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, *(ptr + i)); // 使用指针加法访问元素
}
return 0;
}
代码注释:
int *ptr = arr;
:声明一个指针ptr
,指向数组arr
的第一个元素。数组名arr
作为指针指向第一个元素。*(ptr + i)
:通过指针运算访问数组的第i
个元素。ptr + i
指向数组的第i
个元素,*
用于解引用获取值。- 使用
for
循环遍历数组,并打印每个元素的值。
6. 指向指针的指针
题目描述:
编写一个C程序,定义一个整数变量和一个指针指向该变量。然后定义一个指向指针的指针。通过指针的指针修改整数变量的值,并打印修改后的结果。
解题思路:
通过多级指针(指向指针的指针),可以间接地修改变量的值。程序流程如下:
- 声明一个整数变量并初始化。
- 声明一个指针,指向该整数变量。
- 声明一个指向指针的指针,指向上述指针。
- 使用指针的指针修改整数变量的值。
- 打印修改后的整数值。
详细代码:
#include <stdio.h>
int main() {
int num = 100;
int *ptr = # // 指针指向num
int **pptr = &ptr; // 指向指针ptr的指针
// 打印初始值
printf("初始值: num = %d\n", num);
printf("通过ptr访问: *ptr = %d\n", *ptr);
printf("通过pptr访问: **pptr = %d\n", **pptr);
// 使用指针的指针修改num的值
**pptr = 200;
// 打印修改后的值
printf("修改后: num = %d\n", num);
printf("通过ptr访问: *ptr = %d\n", *ptr);
printf("通过pptr访问: **pptr = %d\n", **pptr);
return 0;
}
代码注释:
int *ptr = #
:声明一个指针ptr
,指向整数变量num
。int **pptr = &ptr;
:声明一个指针的指针pptr
,指向指针ptr
。**pptr = 200;
:通过指针的指针修改num
的值。*pptr
解引用得到ptr
,**pptr
解引用得到num
。- 打印初始值和修改后的值,验证修改是否成功。
7. 指针与函数的结合
题目描述:
编写一个C程序,定义一个函数increment
,接受一个整数指针参数,将指针指向的整数值增加1。在main
函数中调用该函数并输出结果。
解题思路:
函数increment
通过指针访问并修改传递的整数变量。使用指针参数可以直接在函数内部修改变量的值。
程序流程如下:
- 定义函数
increment
,接受一个整数指针作为参数。 - 在函数中,将指针指向的整数值增加1。
- 在
main
函数中,声明一个整数变量并初始化。 - 打印变量增加前的值。
- 调用
increment
函数,传递变量的地址。 - 打印变量增加后的值。
详细代码:
#include <stdio.h>
// 定义函数increment,增加指针指向的整数值
void increment(int *num) {
(*num)++; // 将指针指向的整数值增加1
}
int main() {
int value = 10;
// 打印增加前的值
printf("增加前的值: %d\n", value);
// 调用increment函数,传递变量的地址
increment(&value);
// 打印增加后的值
printf("增加后的值: %d\n", value);
return 0;
}
代码注释:
void increment(int *num)
:定义一个函数,接受一个整数指针参数。(*num)++;
:解引用指针num
,将其指向的整数值增加1。在
main
函数中:
- 声明一个整数变量
value
并初始化为10。 - 打印变量增加前的值。
- 调用
increment(&value)
,传递变量的地址。 - 打印变量增加后的值,验证增加是否成功。
- 声明一个整数变量