《C语言》指针练习题--1

《C语言》指针练习题–1

1. 交换两个整数的值

题目描述:
编写一个C程序,定义一个函数swap,使用指针参数交换两个整数的值。在main函数中调用该函数并输出交换后的结果。

解题思路:
为了交换两个整数的值,可以通过指针传递它们的地址给函数swap。在函数内部,通过解引用指针来交换两个变量的值。这样可以直接修改main函数中变量的值。

程序流程如下:

  1. 定义函数swap,接受两个整数指针作为参数。
  2. swap函数中,使用临时变量交换两个指针指向的值。
  3. main函数中,声明两个整数变量并初始化。
  4. 打印交换前的值。
  5. 调用swap函数,传递变量的地址。
  6. 打印交换后的值。

详细代码:

#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通过遍历数组,累加所有元素的值,然后除以数组的大小,计算出平均值。使用指针可以更高效地访问数组元素。

程序流程如下:

  1. 定义函数calculateAverage,接受一个整数数组和其大小作为参数。
  2. 在函数中,使用指针遍历数组,累加元素的值。
  3. 计算并返回平均值。
  4. main函数中,声明一个整数数组并初始化。
  5. 调用calculateAverage函数,传递数组和大小。
  6. 输出平均值。

详细代码:

#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函数,传递数组名(数组名作为指针)和数组大小。
    • 输出计算得到的平均值。

3. 动态内存分配与释放

题目描述:
编写一个C程序,使用指针动态分配内存来存储一个整数数组。提示用户输入数组的大小和元素,计算数组元素的总和,最后释放分配的内存。

解题思路:
使用malloc函数动态分配所需大小的内存,并通过指针访问和存储数组元素。完成操作后,使用free函数释放内存,避免内存泄漏。

程序流程如下:

  1. 声明一个指向整数的指针。
  2. 提示用户输入数组的大小。
  3. 使用malloc分配内存。
  4. 检查内存是否分配成功。
  5. 提示用户输入数组元素,并通过指针存储。
  6. 遍历数组,计算总和。
  7. 输出总和。
  8. 使用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>:包含mallocfree函数的库。
  • 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通过遍历字符串,检查每个字符是否为小写字母。如果是,则将其转换为大写字母。使用指针可以直接修改字符串中的字符。

程序流程如下:

  1. 定义函数toUpperCase,接受一个字符指针作为参数。
  2. 在函数中,遍历字符串,使用ASCII值将小写字母转换为大写字母。
  3. main函数中,声明一个字符数组并初始化。
  4. 打印转换前的字符串。
  5. 调用toUpperCase函数,传递字符串的指针。
  6. 打印转换后的字符串。

详细代码:

#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>:包含字符处理函数,如islowertoupper

  • void toUpperCase(char *str):定义一个函数,接受一个字符指针,遍历并转换字符串中的小写字母。

  • if(islower(*str)):检查当前字符是否为小写字母。

  • *str = toupper(*str);:将小写字母转换为大写字母。

  • main
    

    函数中:

    • 使用fgets读取用户输入的字符串,包括空格。
    • 遍历字符串,遇到\n则替换为\0,去除换行符。
    • 调用toUpperCase函数,传递字符串的指针。
    • 输出转换前后字符串的内容。

5. 指针与数组的关系

题目描述:
编写一个C程序,定义一个整数数组和一个指针指向该数组的第一个元素。使用指针遍历数组并打印所有元素的值。

解题思路:
在C中,数组名实际上是指向数组第一个元素的指针。通过指针运算,可以遍历数组中的所有元素。程序流程如下:

  1. 声明并初始化一个整数数组。
  2. 声明一个指针,并指向数组的第一个元素。
  3. 使用指针遍历数组,打印每个元素的值。
  4. 通过指针加法或递增指针来访问下一个元素。

详细代码:

#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程序,定义一个整数变量和一个指针指向该变量。然后定义一个指向指针的指针。通过指针的指针修改整数变量的值,并打印修改后的结果。

解题思路:
通过多级指针(指向指针的指针),可以间接地修改变量的值。程序流程如下:

  1. 声明一个整数变量并初始化。
  2. 声明一个指针,指向该整数变量。
  3. 声明一个指向指针的指针,指向上述指针。
  4. 使用指针的指针修改整数变量的值。
  5. 打印修改后的整数值。

详细代码:

#include <stdio.h>int main() {int num = 100;int *ptr = &num;    // 指针指向numint **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通过指针访问并修改传递的整数变量。使用指针参数可以直接在函数内部修改变量的值。

程序流程如下:

  1. 定义函数increment,接受一个整数指针作为参数。
  2. 在函数中,将指针指向的整数值增加1。
  3. main函数中,声明一个整数变量并初始化。
  4. 打印变量增加前的值。
  5. 调用increment函数,传递变量的地址。
  6. 打印变量增加后的值。

详细代码:

#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),传递变量的地址。
    • 打印变量增加后的值,验证增加是否成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92218.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应急响应整理

目录 windows下 1. 检查账号安全 利用注册表实现用户隐藏 粘滞键后门 2 检查异常端口、进程 3. 检查启动项、计划任务、服务 4. 日志分析-Windows 常见事件类型、登录类型 Linux下 1. 账号安全 2. 历史命令 3. 检查异常端口 4. 检查异常进程 5. 检查开机启动项 …

一文读懂 C# 中的 Bitmap

一文读懂 C# 中的 Bitmap 一、Bitmap 到底是什么? 二、推荐使用场景 三、实战 Demo 基础用法:加载、创建和保存 进阶用法 缩放图片 裁剪图片 颜色调整(反色处理) 四、核心方法和属性说明 常用函数 常用属性 五、避坑指南、注意事项 六、总结与决策 一文读懂 C# 中的 Bitmap…

预约时间组件

效果图如何使用<template><view><button click"pickerTime(0)">预约时间0</button><button click"pickerTime(1)">预约时间1</button><button click"pickerTime(2)">预约时间2</button><but…

Android 开发 - Service、Camera、Layout Design 自定义设备类型和大小

一、Service 启动 1、基本介绍 &#xff08;1&#xff09;startService()其他组件通过调用 startService() 启动 Service 后&#xff0c;Service 可在后台无限期运行&#xff0c;即使启动 Service 的组件被销毁也不受影响&#xff0c;一般情况下 startService() 是执行单一操作…

Qwen Image:开源中文渲染SOTA,重塑文生图技术边界

1. Qwen Image的技术定位与行业痛点1.1 文本渲染&#xff1a;文生图领域的长期技术瓶颈传统文生图模型在图像美学与真实感优化上已取得显著进展&#xff0c;但多语言文本渲染始终是行业难以突破的瓶颈。主流模型在处理中文等非字母语言时&#xff0c;常出现字符断裂、布局错位、…

Docker入门教程:在腾讯云轻量服务器上部署你的第一个容器化应用 (2025)

更多云服务器知识&#xff0c;尽在hostol.com“在我电脑上明明是好的啊&#xff01;”这句话&#xff0c;是不是堪称程序员“甩锅”排行榜第一名的金句&#xff1f;当你辛辛苦苦开发完一个应用&#xff0c;把它交给同事或者部署到服务器上时&#xff0c;却发现因为它依赖的某个…

DevOps平台结合Gradle实现打包流水线

在现代软件开发中,持续集成与持续交付(CI/CD)已成为团队提速、降本增效的核心实践。Gradle作为强大的自动化构建工具,常被用于Android与Java项目的构建打包任务。而将Gradle集成进企业的DevOps平台中,不仅可以标准化构建过程,还能自动化打包、测试、发布的全流程,大幅提…

Node.js 操作 MySQL

目录 一、什么是 MySQL&#xff1f; 二、MySQL 的功能概览 三、MySQL 的安装与启动 安装 MySQL 启动服务 四、Node.js 如何连接 MySQL&#xff1f; 使用 mysql2 模块&#xff08;推荐&#xff09; 建立连接 五、创建数据表和插入数据&#xff08;SQL 初始化&#xff09…

解锁高效敏捷:2025年Scrum项目管理工具的核心应用解析

一、为什么Scrum团队需要专业项目管理工具&#xff1f;在敏捷开发实践中&#xff0c;Scrum框架虽然提供了基础的工作流程&#xff0c;但缺乏对任务细粒度管理的支持。传统白板或简单看板工具往往无法满足现代敏捷团队的需求&#xff0c;导致&#xff1a;冲刺规划混乱&#xff1…

途游大数据面试题及参考答案

Java 的反射机制是什么?主要应用在哪些场景? Java的反射机制是指程序在运行时,能够获取自身类的信息(如类名、属性、方法、构造器等),并动态操作这些信息的能力。正常情况下,Java代码编译时类型已确定,而反射打破了这种编译期约束,让程序在运行时灵活操作类和对象。 …

贪心+矩阵算法

贪心算法贪心的本质是&#xff1a;选择每一阶段的局部最优&#xff0c;从而达到全局最优做题的时候&#xff0c;只要想清楚 局部最优 是什么&#xff0c;如果推导出全局最优&#xff0c;其实就够了。买卖股票的最佳实际思路&#xff1a;如果第i天卖出股票&#xff0c;则最大利润…

STM32U5 周期性异常复位问题分析

关键字&#xff1a; Option Bytes, IDWG 1. 问题背景 客户反馈使用 NUCLEO_STM32U575 进行评估时&#xff0c;发现板子烧录完程序后&#xff0c;能看到指示程序运行的 LED 灯正常点亮&#xff0c;但是程序跑不起来。仔细观察 LED 指示灯&#xff0c;并不是常亮而是出现周期性…

RedisBloom使用

安装RedisBloom模块&#xff0c;从git获取对应的原码&#xff0c;make生成.so文件&#xff0c;挂载.so文件&#xff0c;启动redis docker run --name test-redis -v /iothub/test-redis/data:/data -v /iothub/test-redis/modules:/modules -p 6378:6379 -d redis:4.0.10 redis…

ADC、Flash、SPI、watchdog

ADCADC(Analog-to-Digital Converter), 即模拟信号 - 数字信号转换器在STM32F103C8T6中, 同样具有ADC功能.以我们的芯片为例, 也存在2个片上外设ADC, 即ADC1和ADC2, 这两个ADC片上外设都挂载在APB2总线上.我们的ADC片上外设, 是一种具有12位逐次逼近型ADC,ADC转换的本质是不断的…

冷库设备远程监控物联网+省电节能解决方案

随着生鲜电商、医药冷链、跨境物流等行业的爆发式增长&#xff0c;我国冷库容量激增&#xff0c;但传统冷库管理模式正面临严峻挑战。据统计&#xff0c;国内冷链运输损耗率高达12%-15%&#xff0c;其中因温度失控导致的货损占比超60%。在某医药企业冷库事故中&#xff0c;因制…

如何开发一个运行在windows系统服务器上的服务

第一步&#xff1a;vs2022创建一个windows服务项目第二步&#xff1a;从工具箱拖拽出一个timer第三步&#xff1a;按下图所示进入&#xff0c;开始编辑业务逻辑下面给个例子using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; …

本地组策略编辑器无法打开(gpedit.msc命令异常)

一、本地组策略编辑器打开方式1、直接搜索打开&#xff08;1&#xff09;在搜索栏中直接输入以下内容进行搜索本地组策略编辑器&#xff08;2&#xff09;搜索到后直接点击打开即可&#xff08;但是一部分同志无法搜索到&#xff0c;搜索到的内容基本都是网页信息而非本地系统的…

kafka部署集群模式

Kafka部署&#xff08;3.7&#xff09; 生产环境推荐的kafka部署方式为operator方式部署&#xff0c;Strimzi是目前最主流的operator方案。集群数据量较小的话&#xff0c;可以采用NFS共享存储&#xff0c;数据量较大的话可使用local pv存储 部署operator operator部署方式为he…

C语言中级_动态内存分配、指针和常量、各种指针类型、指针和数组、函数指针

0、前言&#xff1a; 动态内存分配是一个重要概念&#xff0c;要和静态数组对比着学习&#xff1b;指针和数组搭配在一起&#xff0c;让指针理解的难度上了一个台阶&#xff0c;尤其是二维数组搭配指针&#xff0c;要获取数组的值&#xff0c;什么时候“取地址”&#xff0c;什…

单变量单步时序预测:CNN-GRU卷积神经网络结合门控循环单元

目录预测效果1. **CNN-GRU的基本原理**2. **应用场景**3. **模型结构与实现**4. **优势与挑战**5. **相关研究与实现**6. **未来发展方向**结论代码设计预测效果 CNN-GRU卷积神经网络结合门控循环单元是一种结合了卷积神经网络&#xff08;CNN&#xff09;和门控循环单元&#…