Linux C语言基础 day9

目录

思维导图

学习目标:

学习内容:

1. 值传递与地址传递(非常重要)

1.1 值传递

1.2 地址传递

2. 递归函数

2.1 递归的概念

2.2 递归条件

2.3 递归思想

3. 指针

3.1 指针相关概念

3.2 指针变量的定义

3.2.1. 定义格式

3.2.2. 指针变量的初始化

3.3 指针变量的使用

课内练习:

课外作业:


思维导图


学习目标:

  • 一周掌握 C基础知识

学习内容:

1. 值传递与地址传递(非常重要)

1.1 值传递

说明:

        值传递过程中,形参与实参操作的是不同的内存空间

        当普通变量作为函数参数传递时,是单向的值传递,仅仅只是将实参的值,复制一份给形参使用,形参的改变不会影响到实参的值

例如:

#include<stdio.h>

//定义交换函数

void swap_1(int m, int n)

{

    //完成两个数的交换

    int temp = m;

    m = n;

    n = temp;

    printf("交换后,swap_1:: m = %d, n = %d\n", m, n);

}


 

/*********************主程序*********************/

int main(int argc, const char *argv[])

{

    //定义两个变量

    int num = 520;

    int key = 1314;

    //调用交换函数

    swap_1(num, key);

    printf("交换后,main:: num = %d, key = %d\n", num, key);


 

    return 0;

}

1.2 地址传递

说明:

        当实参传递的是数组名、指针或变量的地址(&num)时,可以理解成是地址传递

        地址传递过程中,形参与实参操作的是同一块内存空间

        形参对内存空间进行改变时,实参也跟着一起改变

例如:

#include<stdio.h>

//定义冒泡排序函数

void sort_up(int brr[], int n)

{

    printf("sizeof(brr) = %ld\n", sizeof(brr));   //

    //进行冒泡排序

    for(int i=1; i<n; i++)

    {

        for(int j=0; j<n-i; j++)

        {

            if(brr[j] > brr[j+1])

            {

                int temp = brr[j];

                brr[j] = brr[j+1];

                brr[j+1] = temp;

            }

        }

    }

    printf("排序结束\n");

}



 

/****************主程序********************/

int main(int argc, const char *argv[])

{

    //定义一个一位数组并初始化

    int arr[5] = {2,8,1,6,7};

    printf("sizeof(arr) = %ld\n", sizeof(arr));    //20

    //调用冒泡排序函数,完成升序排序

    sort_up(arr, 5);

    //输出排序后的结果

    printf("排序后:");

    for(int i=0; i<5; i++)

    {

        printf("%d\t", arr[i]);

    }

    printf("\n");

    return 0;

}

2. 递归函数

2.1 递归的概念

        所谓递归,就是一个函数直接或间接的形式调用自身,这样的函数调用,我们称为递归调用

2.2 递归条件

1. 递归出口:用于终止递归进行进行的条件

2. 递归表达式:能够让递归继续进行的函数调用

2.3 递归思想

        当直接解决规模比较大的问题不能进行时,需要先解决规模较小的原理一致的问题后,大的问题得以解决时,可以考虑使用递归

        逐层分解,逐层合并

例如:

#include<stdio.h>


 

int jiecheng(int n)

{

    if(n==0){

        return 1;

    }else

        return n*jiecheng(n-1);

}


 

/****************主程序********************/

int main(int argc, const char *argv[])

{

    int res = jiecheng(5);

    printf("%d",res);

    return 0;

}

3. 指针

3.1 指针相关概念

1. 引入目的:能够从地址的角度,找到内存中的数据,而不是以变量的角度去找,效率较高

2.  指针:就是内存地址编号

3.  指针变量:由于指针这个地址编号很难记忆,我们引入指针变量存储指针

存储地址的变量称为指针变量

4.  指针变量中,只能存储地址,作为一个特殊的数据类型,其大小是固定的 8 字节

3.2 指针变量的定义

3.2.1. 定义格式

        数据类型 * 指针名;

        例如:int * ptr;

3.2.2. 指针变量的初始化

        1、使用一个相同数据类型的变量的地址为其进行初始化

                int num = 520; int * ptr = &num //将num的地址赋值个指针变量 ptr //定义一个指针变量ptr,指向num

        2、使用一个已经初始化了的指针变量给一个新的指针变量进行初始化

                int * qtr = ptr; //此时表示两个指针变量同时存储了num的地址 int *qtr =&num

        3、使用地址的0 就是 NULL为其初始化

                int *wtr = NULL;

        4、注意:没有初始化的指针变量不能直接使用,因为该指针变量中存储了一个随机地址,如果对其进行更改,可能会导致系统瘫痪

        5、野指针:指向非法内存的指针称为野指针 产生情况:

                1)定义指针时,没有为其进行初始化

                2) 指向了一个内存空间,但是随着程序的进行,该内存空间被回收了,那么该指针也是野指针(悬空指针)

                3) 数组下标越界时,访问的地址也是野指针

3.3 指针变量的使用

        使用运算符 ‘ * ’来取得指针变量中的值,我们也称该运算为 取值运算

        &与*在指针的方面,互为逆运算

        int num = 520; int *ptr = &num;

                1) *&num ==> *(&num) ==> *(ptr) ==> num

                2) &*ptr ==> &(*ptr) ==> &(num) ==> ptr

                3) *&ptr ==>*(&ptr) ==> *(ptr的二级地址) ==> ptr

                4) &*num ==>报错


课内练习:

1.求n!结果

解析:

2.求斐波那契数列第n项的值

1 1 2 3 5 8 13 21 。。。

解析:


课外作业:

1.使用递归实现 求 n 的 k 次方

解析:

#include<stdio.h>

//函数

int jiecheng(int n,int k)

{

    if(k==0){

        return 1;

    }else

        return n*jiecheng(n,k-1); //返回n*n*......*n(k个n)

}


 

/****************主程序********************/

int main(int argc, const char *argv[])

{

    int k=0,n=0;

    printf("请输入底数n与指数k:");

    scanf("%d%d",&n,&k);

    int res = jiecheng(n,k);      //调用函数

    printf("值为:%d",res);

    return 0;

}

2.使用递归实现 strlen 的功能

解析:

#include<stdio.h>
int rec(char *str) {
    // 基本情况:如果字符串为空,则长度为0
    if (*str == '\0') {
        return 0;
    } else {
        // 递归步骤:当前字符加上剩余字符串的长度
        return 1 + rec(str + 1);
    }
}
int main(int argc, char const *argv[])
{
    char str[101]; // 假设输入的字符串长度不超过100
    printf("请输入一个字符串:");
    gets(str);              //获取字符串
    int len = rec(str);             //调用函数
    printf("字符串的长度是:%d\n", len);
    return 0;
}
 

3.使用递归实现汉诺塔问题

解析:

#include<stdio.h>
int  hanuo(int n) {
    if (n == 1) {
        return 1;
    } else {
        return hanuo(n-1)*2+1;
    }
}
int main(int argc, char const *argv[])
{
    int n=0;
    printf("请输入n的值:");
    scanf("%d",&n);
    int sum=hanuo(n);
    printf("次数为%d\n",sum);
    return 0;
}
 

4.定义一个函数将一个字符串从大到小排序

解析:

#include <stdio.h>
#include<string.h>
#define MAX 50
// 函数声明
int  change(char a[]);
int main() {
    char a[MAX];
    printf("请输入字符串:");
    scanf("%s",a);
    change(a);                          //调用函数
    printf("字符串从大到小排序为:%s\n",a);
    return 0;
}

int change(char a[]){
    int len=0;                          
    len= strlen(a);                 //定义数组长度
    int max=0;
    for (int i = 1; i < len; i++)             
    {
        for(int j=0;j <len-i;j++ ){
            if(a[j] < a[j+1]){                              //判断大小,进行交换三部曲
                 char temp = a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
            }
        }
    }
}

5.实现一个函数,用于检查一个字符串是否是回文字符串(正序和反序都相同)

解析:

#include <stdio.h>
#include<string.h>
#define MAX 50
int huiwen(char s[]){
    int left=0;                                  //定义最左边下标
    int right = strlen(s)-1;          //定义最右边下标
    while (left <= right)
    {
       if(s[left] == s[right]){         //判断是否相等
           return 1;
           left++;                                  //逐渐向右递增
           right--;                                 //逐渐向左递增
       }else
       {
           return 0;
       }   
    }
}
int main() {
    char a[MAX];
    printf("请输入字符串:");
    scanf("%s",a);
    if(huiwen(a)==1){
        printf("是回文字符串\n");
    }else
    {
       printf("不是回文字符串\n");
    }
    return 0;
}

6.使用指针完成判断自己的主机存储多字节整数时,是大端存储还是小端存储

解析:

#include<stdio.h>
int main(int argc, char const *argv[])
{
    int a=0x12345678;
    char *p=(char *)&a;
    if(*p == 0x78){
        printf("为小端存储\n");
    }else if(*p ==0x12 ){
        printf("为大端存储\n");
    }
    return 0;
}

7.

解析:

#include<stdio.h>
#include<string.h>
#define MAX    50
int count(char a[MAX]){
    int sum=0;
    int inWord=0;
    gets(a);
        for (int i = 0; a[i] != '\0'; i++) {             
        if ((a[i] >= 'A' && a[i] <= 'Z') ||(a[i] >= 'a' && a[i] <= 'z')) {               // 检查当前字符是否为字母
            if (inWord==0) {                  // 如果之前不在单词中,现在是单词的开始
                sum++;                          // 增加单词计数
                inWord = 1; // 标记现在在单词中
            }
        } else {
            // 如果当前字符不是字母或数字,不在单词中
            inWord = 0;
        }
    }
    printf("单词数为%d个\n",sum);
}
int main(int argc, char const *argv[])
{
    char a[MAX];
    count(a);
    return 0;
}
 

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

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

相关文章

对于GPT-5在一年半后发布的期待!

首先&#xff0c;如果GPT-5真如OpenAI首席技术官米拉穆拉蒂&#xff08;Mira Murati&#xff09;在采访中所透露的那样&#xff0c;在一年半后发布&#xff0c;并在某些领域达到博士级的智能&#xff0c;这无疑将是一个令人振奋的消息。这一预测不仅反映了AI技术的快速发展&…

Raw Socket(二)循环队列收发数据

完整代码在&#xff1a; 添加链接描述 其中tcp_handshake文件夹是实现TCP三次握手的demo。 完整代码参考&#xff1a; https://github.com/praveenkmurthy/Raw-Sockets 代码实现基于raw socket的TCP协议&#xff0c;发送http请求包并接收回包&#xff0c;…

C# Winform布局控件的几种方式

在 C# WinForms 应用程序中&#xff0c;布局控件和布局管理器可以帮助开发者创建响应式的用户界面&#xff0c;即使在窗口大小改变时也能保持控件的正确位置和尺寸。 通常我们采用Panel和Dock&#xff0c;辅助Anchor实现类似如下的布局。 以下是几种常见的布局控件和方法&…

07:串口通信二

串口编程 1、与波特率之相关的寄存器2、PCON寄存器3、SCON寄存器4、配置的代码分析5、向PC发送一段字符串6、PC机向单片机发送字符控制LED1灯的亮灭 1、与波特率之相关的寄存器 如图&#xff0c;与串口通信相关的寄存器主要是SCON和PCON寄存器。 2、PCON寄存器 SMOD&#xff1…

普通人还有必要学习 Python 之类的编程语言吗?

在开始前分享一些编程的资料需要的同学评论888即可拿走 是我根据网友给的问题精心整理的对于编程的重要性&#xff0c;这里就不详谈了。 未来&#xff0c;我们和机器的交流会越来越多&#xff0c;编程可以简单看作是和机器对话并分发给机器任务。机器不仅越来越强大&#xff0…

java面向对象进阶篇--static

一、前言 java进阶篇已经开始了&#xff0c;先从面向对象开始&#xff0c;由于时间原因今天就只更新了static部分&#xff0c;内容上特别详细&#xff0c;一些特别的注意事项也在反复的提醒大家。 温馨提示一下&#xff0c;往后的java篇会越来越难&#xff0c;希望大家能够坚…

IOS上微信小程序密码框光标离开提示存储密码解决方案

问题&#xff1a; ios密码框输入密码光标离开之后会提示存储密码的弹窗 解决方案 1、在苹果手机上面把 “自动填充密码”关闭&#xff0c;但是苹果这个默认开启&#xff0c;而且大部分客户也不会去自己关闭。 2、欺骗苹果手机&#xff0c;代码实现。 先说解决思路&#xf…

玩转HarmonyOS NEXT之IM应用首页布局

本文从目前流行的垂类市场中&#xff0c;选择即时通讯应用作为典型案例详细介绍HarmonyOS NEXT的各类布局在实际开发中的综合应用。即时通讯应用的核心功能为用户交互&#xff0c;主要包含对话聊天、通讯录&#xff0c;社交圈等交互功能。 应用首页 创建一个包含一列的栅格布…

[图解]SysML和EA建模住宅安全系统-14-黑盒系统规约

1 00:00:02,320 --> 00:00:07,610 接下来&#xff0c;我们看下一步指定黑盒系统需求 2 00:00:08,790 --> 00:00:10,490 就是说&#xff0c;把这个系统 3 00:00:11,880 --> 00:00:15,810 我们的目标系统&#xff0c;ESS&#xff0c;看成黑盒 4 00:00:18,030 --> …

Home Assistant在windows环境安装

Home Assistant是什么&#xff1f; Home Assistant 是一个开源的智能家居平台&#xff0c;旨在通过集成各种智能设备和服务&#xff0c;提供一个统一的、可自定义的家庭自动化解决方案。它可以允许用户监控、控制和自动化家中的各种设备&#xff0c;包括灯光、温度、安全系统、…

公司想无偿裁员,同事赖着不走

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 这招好像也不错! 事情是这样的&#xff1a;某公司准备把成本高的员工都裁掉&#xff0c;主要包含研发部和程序员&#xff0c;总共18个人&#xff0c;准备裁掉10人&#xff0c;因为他们工资开的太高了&#xff0c;…

【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介 看门狗从本质上来说也是一个定时器&#xff0c;它是用来监测硬件或软件的故障的&#xff1b;它的工作原理大概就是开启后内部定时器会按照设置的频率更新&#xff0c;在程序运行过程中我们需不断地重装载看门狗&#xff0c;以使它不溢出&#xff1b;如果硬件或软件发生…

基于pytesseract的OCR图片识别

简介 pytesseract是基于谷歌的tesseract的OCR包&#xff0c;支持识别一些简单的数字、字母、中文。 安装 安装引擎 下载地址&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 一般是Windows 64位系统最新版&#xff1a; 如果要识别中文&#xff0c;注意选中中文…

python每日一题:回文数

题干 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。例如&#xff0c;121 是回文&#xff0…

02:项目二:感应开关盖垃圾桶

感应开关盖垃圾桶 1、PWM开发SG901.1、怎样通过C51单片机输出PWM波&#xff1f;1.2、通过定时器输出PWM波来控制SG90 2、超声波测距模块的使用3、感应开关盖垃圾桶 需要材料&#xff1a; 1、SG90舵机模块 2、HC-SR04超声波模块 3、震动传感器 4、蜂鸣器 5、若干杜邦线 1、PWM开…

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】

文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中&#xff0c;然后在将用户的查询向量化&#xff0c;从向量数据库中召回相似性数据&#xff0c;构造成 context template, 放到 LLM 中进行查询…

【香橙派AiPro】基于VGG16的火灾检测模型预测

目录 引言开发板介绍开发板使用准备工作工具文档 拨码开关镜像烧录连接开发板下载MobaXterm网线-SSH连接开发板设置WIFI连接WIFI-SSH连接开发板确定开发板IP方法 Vnc可视化WindowsiPad 开发工具安装 散热风扇基于VGG16的火灾检测模型预测数据集准备目录结构代码操作 安装宝塔最…

Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者&#xff0c;Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。 Puppeteer简…

【Neural signal processing and analysis zero to hero】- 1

The basics of neural signal processing course from youtube: 传送地址 Possible preprocessing steps Signal artifacts (not) to worry about doing visual based artifact rejection so that means that before you start analyzing, you can identify those data epic…

有关电力电子技术的一些相关仿真和分析:⑤交-直-交全桥逆变+全波整流结构电路(MATLAB/Siumlink仿真)

全桥逆变+全波整流结构 参数:Vin=500V, Vo=200V, T=2:1:1, RL=10Ω, fs=100kHz, L=1mH, C=100uF (1)给定输入电压,输出电压和主电路参数,仿真研究电路工作原理,分析工作时序; (2)调节负载电阻,实现电流连续和断续,并仿真验证; (3)调节占空比,分析占空比与电…