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等协议标准…

教育与人的发展

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

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

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

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的灵活性和广泛的…

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;框架可以接受和处理来自用户输…

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

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

[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="产品优势">产品优…

《双流多依赖图神经网络实现精确的癌症生存分析》| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 Dual-stream multi-dependency graph neural network enables precise cancer survival analysis 《双流多依赖图神经网络实现精确的癌症生存分析》 01 文献速递介绍 癌症是全球主要的死亡原因&#xff0c;2020年约有1930万新发癌症病例和近1000万癌症相关死亡…

【Java】Idea运行JDK1.8,Build时中文内容GBK UTF-8编码报错一堆方块码

问题描述 在Windows系统本地运行一个JDK1.8的项目时&#xff0c;包管理用的Gradle&#xff0c;一就编码报错&#xff08;所有的中文内容&#xff0c;包括中文注释、中文的String字面量&#xff09;&#xff0c;但程序还是正常运行。具体如下&#xff1a; 解决 1. Idea更改编…

C++——类和对象(上)

文章目录 一、类的定义1.类定义格式2.访问限定符3.类域 二、实例化1.实例化概念2.对象⼤⼩ 三、 this指针 一、类的定义 1.类定义格式 与定义结构体类似 class ST {//成员变量int val;//成员函数void print(){cout << val << endl;}};class为定义类的关键字&…

查看尝试登服务器ssh 访问ip地址

不指定时间查看尝试登录服务器的SSH访问IP地址 # CentOS/RHEL系统 zgrep "sshd" /var/log/secure-* | grep "Failed password" | awk {print $(NF-3)} | sort | uniq -c | sort -nr | head -n 10检查过去7天的日志尝试登录服务器的SSH访问IP地址 # CentOS…

AutoMQ vs Kafka: 来自小红书的独立深度评测与对比

测试背景 当前小红书消息引擎团队与 AutoMQ 团队正在深度合作&#xff0c;共同推动社区建设&#xff0c;探索云原生消息引擎的前沿技术。本文基于 OpenMessaging 框架&#xff0c;对 AutoMQ 进行了全面测评。欢迎大家参与社区并分享测评体验。 01 测试结论 本文主要测评云…

AI克隆声音,基于函数计算部署GPT-Sovits语音生成模型

阿里云的 https://developer.aliyun.com/adc/scenario/808348a321844a62b922187d89cd5077 还是 函数计算 FC (aliyun.com) 选择 语音克隆生成 GPT-SOVITS 通过访问域名就能访问 就可以上传个人的声音&#xff0c;然后进行输出 。

【逆向基础】十、逆向工具分享之DIE(Detect It Easy)

一、简介 DIE&#xff08;Detect It Easy&#xff09;是一款可以轻松检测PE文件的程序&#xff1b;其主要作用是查壳&#xff0c;并将pe文件的内容解析出来&#xff0c;包括PE文件中包含的导入函数、导出函数的名称及地址&#xff0c;入口函数地址等&#xff0c;是技术人员分析…