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=&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.mzph.cn/bicheng/45251.shtml

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

相关文章

5G/4G加密边缘计算电力网关,开启智慧电力新篇章

计讯物联TG452&#xff0c;一款面向电力行业应用的工业级物联网网关&#xff0c;持电力协议及规约标准&#xff0c;支持采集、存储、算力、通信组网 、协议转换、控制等多功能。    电力应用   计讯物联电力网关TG452支持电力IEC101、IEC104、IEC61850、DL/T645等协议标准…

Android 内部保持数据的方式

Android内部保持数据的方式主要有五种&#xff0c;每种方式都有其特定的用途和优点。以下是详细的介绍&#xff1a; SQLite数据库 定义&#xff1a;SQLite是一个轻量级的、跨平台的数据库&#xff0c;所有的信息都存储在单一文件内&#xff0c;占用内存小&#xff0c;并且支持…

教育与人的发展

个体身心发展的一般规律 个体身心发展的动因 影响人身心发展的因素

vue2 使用 Socket.io 实现 WebSocket

使用 NPM&#xff1a; 官网&#xff1a;https://socket.io/zh-CN/docs/v4/ 客户端API&#xff1a;https://socket.io/zh-CN/docs/v4/client-api/#socket 1、安装 Socket.io 客户端 首先&#xff0c;在你的 Vue 项目中安装 socket.io-client&#xff1a; npm install socket…

Gentec-eo高功率测量仪激光功率HP60HP100系列软件驱动使用说明

Gentec-eo高功率测量仪激光功率HP60HP100系列软件驱动使用说明

使用 docker-compose 部署和使用 Yapi

Yapi 就是一款高效、易用、功能强大的 api 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 api&#xff0c;YApi 还为用户提供了优秀的交互体验&#xff0c;开发人员只需利用平台提供的接口数据写入工具以及简单…

LLM基础模型系列:Fine-Tuning总览

由于对大型语言模型&#xff0c;人工智能从业者经常被问到这样的问题&#xff1a;如何训练自己的数据&#xff1f;回答这个问题远非易事。生成式人工智能的最新进展是由具有许多参数的大规模模型驱动的&#xff0c;而训练这样的模型LLM需要昂贵的硬件&#xff08;即许多具有大量…

百日筑基第十八天-一头扎进消息队列1

百日筑基第十八天-一头扎进消息队列1 先对业界消息队列有个宏观的认识 消息队列的现状 当前开源社区用的较多的消息队列主要有 RabbitMQ、RocketMQ、Kafka 和Pulsar 四款。 国内大厂也一直在自研消息队列&#xff0c;比如阿里的 RocketMQ、腾讯的 CMQ 和 TubeMQ、京东的 JM…

Docassemble interview 未授权任意文件读取漏洞复现(CVE-2024-27292)

0x01 产品简介 Docassemble是一款强大的开源工具,主要用于自动化生成和定制复杂文档,特别是在法律文档处理领域表现出色。由Jonathan Pyle个人开发者开发,是一个免费的开源专家系统,用于指导访谈和文档组装。Docassemble基于Python编写,充分利用了Python的灵活性和广泛的…

【gpt】学习笔记:ChatGPT 用于 3D 内容生成搭配nvidia deepsearch

ChatGPT 和 GPT-4 如何用于 3D 内容生成 原文 英文原文 创建ChatGPT的提示(Prompt) ChatGPT的提示由四个部分组成:系统输入、用户输入示例、助手输出示例和用户提示。 让我们从适应用户情境的提示方面开始。这包括用户输入的文本和场景数据。 例如,如果用户想创建一个接待室…

Axure-黑马

Axure-黑马 编辑时间2024/7/12 来源&#xff1a;B站黑马程序员 需求其他根据&#xff1a;visio&#xff0c;墨刀 Axure介绍 Axure RP是美国Axure Software Solution给公司出品的一款快速原型大的软件&#xff0c;一般来说使用者会称他为Axure 应用场景 拉投资使用 给项目团…

Proteus + Keil单片机仿真教程(六)多位LED数码管的动态显示

上一节我们通过锁存器和八个八位数码管实现了多个数码管的静态显示,这节主要讲解多位数码管的动态显示,所谓的动态显示就是对两个锁存器的控制。考虑一个问题,现在给WS位锁存器增加一个循环,让它从1111 1110到0111 1111会发生什么事情?话不多说,先上代码: #include<…

充气膜游泳馆安全吗—轻空间

充气膜游泳馆&#xff0c;作为一种新型的游泳场馆&#xff0c;以其独特的结构和众多优点&#xff0c;逐渐受到各地体育设施建设者的青睐。然而&#xff0c;关于充气膜游泳馆的安全性&#xff0c;一些人仍然心存疑虑。那么&#xff0c;充气膜游泳馆到底安全吗&#xff1f;轻空间…

Struts 2.0.0 至 2.1.8.1 远程命令执行漏洞(CVE-2010-1870)

前言 CVE-2010-1870 是一个存在于 Apache Struts 2 中的漏洞&#xff0c;特别是在 Struts 2 动作框架中。这个安全缺陷允许远程攻击者通过操纵动态方法调用&#xff08;DMI&#xff09;功能在服务器上执行任意代码。当 DMI 功能启用时&#xff0c;框架可以接受和处理来自用户输…

白骑士的C++教学进阶篇 2.2 面向对象编程(OOP)

系列目录 上一篇&#xff1a;白骑士的C教学进阶篇 2.1 指针与引用 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种编程范式&#xff0c;通过将数据和操作数据的方法封装在对象中来实现代码的重用性、可扩展性和可维护性。C作为一…

Java中HashMap详解:hash原理、扩容机制、线程不安全及源码分析

前言 HashMap 是 Java 中常用的数据结构之一&#xff0c;用于存储键值对。在 HashMap 中&#xff0c;每个键都映射到一个唯一的值&#xff0c;可以通过键来快速访问对应的值&#xff0c;算法时间复杂度可以达到 O(1)。 HashMap 的实现原理是基于哈希表的&#xff0c;它的底层是…

如何在element中table的 v-for中 使用slot-scope?

有时候我们需要通过数据库来动态控制表格的列,这样做的好处就是系统中如果有太多的表格项的话,直接这套代码就能通用了,其他的数据库里控制就行,不要太方便了,特别是一些ERP或者供应链的表格,动不动就是几十上百个字段,这时候不要太轻松了,废话不多说,直接上代码: &…

[Godot3.3.3] - 过渡动画

过渡动画 ScreenTransitionAnimation 项目结构 添加场景&#xff0c;根节点为 CanvasLayer2D 并重命名为 ScreenTransition: 添加子节点 ColorRect 和 AnimationPlayer&#xff0c;在 ColorRect 中将颜色(Color)设置为黑色&#xff1a; 找到 Material&#xff0c;新建 Shader…

AI网络爬虫022:批量下载某个网页中的全部链接

文章目录 一、介绍二、输入内容三、输出内容一、介绍 网页如下,有多个链接: 找到其中的a标签: <a hotrep="doc.overview.modules.path.0.0.1" href="https://cloud.tencent.com/document/product/1093/35681" title="产品优势">产品优…

【嵌入式DIY实例-ESP8266篇】-LCD1602显示DS1621传感器数据

LCD1602显示DS1621传感器数据 文章目录 LCD1602显示DS1621传感器数据1、DS1621介绍2、硬件准备与接线3、代码实现在本文中,介绍如何将 ESP8266 NodeMCU 板 (ESP-12E) 与 DS1621 数字温度传感器连接,其中温度值(摄氏度和华氏度)打印在 1602 LCD 屏幕上。 本项目中使用的 160…