嵌入式学习第二篇——C语言基础12

目录

指针

1.const指针

     2.void

3.函数指针和指针函数:

    1.指针函数:

    2.函数指针:

    4.C语言中二级指针使用场景:

    1.指针数组传参时:

    2.函数体内想修改函数体外指针变量值的时

构造数据类型:   

数据类型:       

1.基本数据类型:         

           1, int 

            2,double 

            3,char 

            4,等等

  2.构造数据类型:         

    1.struct 结构体         

    2.union 共用体       

    3.enum  枚举

1.结构体:   

1.结构体类型的定义     

    2.结构体变量的定义     

    3.结构体变量的初始化:

        1.全部初始化:

        2.局部初始化:

    4.结构体成员变量的访问:

作业:


指针

1.const指针

定义形式:
    const 关键字   常量(只读)   readonly 

    1.const int *p;
    2.int const *p;
    3.int *const p;
    4.const int *const p;
    5.int const *const p;

    1和2是等价的
    const修饰 *p,指针变量p的值可以改变,但不能利用指针修改指向空间中的值

    3
    const修饰 p,指针变量p的值不能改变,但可以利用指针变量p修改指向空间中的值
    一定要对指针初始化

    4和5是等价的
    const修饰p和*p,指针变量p的值不能改变,也不能利用*p改变直系那个空间中的值
    一定要初始化  

参考如下:

#include<stdio.h>int main(void)
{const int *p = NULL;int const *q = NULL;int a = 300;int *const m = &a;const char *const n = "how";char const *const v = "are";p = &a;q = &a;printf("*P = %d *q = %d\n",*p,*q);printf("*m = %d\n",*m);*m = 200;printf("*P = %d *q = %d\n",*p,*q);printf("*m = %d\n",*m);return 0;
}


    
 2.void


    void a;

    高精度
    int *p;
    double *p;
    char *p;

    低精度
    void *p;
    p保存内存地址

    int *、double *、char * 转换为 void * 需要强制类型转换
    void *转换为int *、double *、char *不需要强制类型转换

    strcpy -> 拷贝字符串
    memcpy -> 拷贝一段内存空间

参考如下:

#include<stdio.h>char *fun(void)
{char *str = {"hello world"};
//	char str[32] = {"hello world"};return str;
}int main(void)
{char *p = NULL;p = fun();printf("p = %s\n",p);return 0;
}

3.函数指针和指针函数:


    指针函数:是函数,函数的返回值类型是指针类型
    函数指针:是指针,指针指向了函数

    1.指针函数:


        局部变量的地址不能返回,因为局部变量会随函数作用域结束被回收,虽然能够获得返回的地址,但地址对应的空间已经被回收过了

        将函数的返回值作为下一个函数的参数

参考如下:

#include<stdio.h>
#include<string.h>char *fun(char *p,const char *q)
{char *o = p;while(*q != '\0'){*p = *q;p++;q++;}*p = '\0';return o;
}int main(void)
{char str1[32] = {0};char str2[32] = {0};fun(str2,fun(str1,"hello world"));printf("str1 = %s str2 = %s\n",str1,str2);strcpy(str2,strcpy(str1,"how are you"));printf("str1 = %s str2 = %s\n",str1,str2);return 0;
}

    2.函数指针:

        定义形式:

        int (*Fun)(int a, int b) = NULL;


        定义函数指针变量Fun,占8个字节空间,指向int返回值有2个int参数的函数

参考如下:    

#include<stdio.h>
#include<stdlib.h>#define N jjiangint Inputa(int *pa,int len)
{int i = 0;for(i = 0;i < len;i++){scanf("%d",&pa[i]);}return 0;
}int Outputa(int *pa,int len)
{int i = 0;for(i = 0;i < len;i++){printf("%d ",pa[i]);}printf("\n");return 0;
}int Sorta(int *pa,int len,int (*pcmp)(int ,int ))
{int i = 0;int j = 0;int tmp = 0;for(j = 0;j < len -1;j++){for(i = 0;i < len - 1 - j;i++){if(pcmp(pa[i],pa[i+1])){tmp = pa[i];pa[i] = pa[i+1];pa[i+1] = tmp;}}}return 0;
}int sheng(int num1,int num2)
{if(num1 > num2){return 1;}return 0;
}int jiang(int num1,int num2)
{if(num2 > num1){return 1;}return 0;
}int jsheng(int num1,int num2)
{if(abs(num1) > abs(num2)){return 1;}return 0;
}int jjiang(int num1,int num2)
{if(abs(num2) > abs(num1)){return 1;}return 0;
}int main(void)
{int a[5] = {0};Inputa(a,5);Sorta(a,5,N);Outputa(a,5);return 0;
}


4.C语言中二级指针使用场景:


    1.指针数组传参时:

        定义形式:
        char *str[5];

        int Fun(char **ppstr, int len);

    2.函数体内想修改函数体外指针变量值的时

        要传递指针变量的地址即二级指针


        char *p = NULL;

        int Fun(char **pp);

参考如下:

#include<stdio.h>void fun(char **p)
{*p = "hello world!";return;
}int main(void)
{char *p = NULL;fun(&p);printf("p = %s\n",p);}

==================================================================================================================================================

构造数据类型:
   

数据类型:
       

1.基本数据类型:
         

           1, int 

            2,double 

            3,char 
            4,等等

     

  2.构造数据类型:
         

    1.struct 结构体
         
    2.union 共用体
       
    3.enum  枚举

1.结构体:
   

1.结构体类型的定义
     

  struct 结构体名 
        {
            数据类型1 成员变量1;
            数据类型2 成员变量2;
            数据类型3 成员变量3;
            ..
        };

    2.结构体变量的定义
     

         数据类型 变量名;
         数据类型 *指针变量名;

    3.结构体变量的初始化:


        1.全部初始化:


            struct student s = {"zhangsan", 'm', 19, 100};

        2.局部初始化:


            struct student stu = {
                .name = "lisi",
                .score = 90,
            };  

参考如下:

#include<stdio.h>struct time
{int hour;int min;int sec;
};struct date
{int year;int mon;int day;
};struct datetime 
{struct time t;struct date d;
};struct yusuan
{int jia;int jian;int cheng;int chu;
}ys;int main(void)
{struct yusuan ys = {1,2,3,4};	struct datetime dt = {{15,54,30},{2024,1,29}};struct date da = {.year = 2024,.mon = 1,};struct datetime *p = NULL;struct time ti = {16,33,10};p = &dt;printf("%d:%d:%d\n",ti.hour,ti.min,ti.sec);printf("%d-%d-%d-%d:%d:%d\n",dt.d.year,dt.d.mon,dt.d.day,dt.t.hour,dt.t.min,dt.t.sec);printf("%d----%d\n",p->d.year,p->t.hour);return 0;
}

    4.结构体成员变量的访问:


         .  :结构体变量类型访问成员变量使用 .
        ->  :结构体指针类型访问成员变量使用 -> 

        整体类型由成员变量类型决定

参考如下:

#include<stdio.h>
#include<string.h>struct stduent
{char name[32];char sex;int age;int score;
};int main(void)
{struct stduent s;memset(&s,0,sizeof(s));gets(s.name);s.sex = getchar();scanf("%d%d",&s.age,&s.score);printf("姓名:%s\n性别:%c\n年龄:%d\n成绩:%d\n",s.name,s.sex,s.age,s.score);return 0;
}


作业:


    1.定义一个结构体包含年-月-日三个成员
        struct date 
        {
            int year;
            int mon;
            int day;
        };
        从终端接收年月日信息存放到结构体中,计算该天为该年的第几天?计算该年剩余多少天?打印年月日信息
    
    2.封装一个函数,给定一个数字字符串转换成其对应的整形数
        "123456"
        123456 

        int MyAtoi(char *pstr);

1,

#include<stdio.h>
#include<string.h>struct date
{int year;int mon;int day;
};int main(void)
{int panduan = 0;int sum = 0;int last = 0;int i = 0;int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};struct date d;memset(&d,0,sizeof(d));scanf("%d%d%d",&d.year,&d.mon,&d.day);if(d.year % 4 == 0 && d.year % 100 != 0 || d.year % 400 == 0){panduan = 1;}if(panduan == 1){a[2] = 29;}for(i = 0;i < d.mon;i++){sum += a[i];}sum += d.day;last = 356 - sum;if(panduan == 1){last = 366 - sum;}printf("%d-%d-%d为该年第%d天,该年还剩%d天\n",d.year,d.mon,d.day,sum,last);return 0;
}

2,

#include<stdio.h>
#include<string.h>int MyAtoi(char *pa)
{int sum = 0;int len = strlen(pa);while(*pa != '\0'){sum = sum * 10 + (*pa - 48);pa++;}return sum;
}int main(void)
{char a[64] = {0};int b = 0;gets(a);b = MyAtoi(a);printf("%d\n",b);return 0;
}

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

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

相关文章

MySQL原理(二)存储引擎(3)InnoDB

目录 一、概况&#xff1a; 1、介绍&#xff1a; 2、特点&#xff1a; 二、体系架构 1、后台线程 2、内存池&#xff08;缓冲池&#xff09; 三、物理结构 1、数据文件&#xff08;表数据和索引数据&#xff09; 1.1、作用&#xff1a; 1.2、共享表空间与独立表空间 …

计算机网络——静态路由的配置实验

1.实验题目 实验四&#xff1a;静态路由的配置 2.实验目的 1.了解路由器的基本配置。 2.实现对路由器的静态配置。 3.了解Ping命令和trace的原理和使用 3.实验任务 &#xff08;1&#xff09;路由器的基本配置&#xff1a;关闭域名解释&#xff1b;设置路由器接口 IP 地…

DVWA csrf代码分析

LOW级别 源码如下&#xff1a; <?phpif( isset( $_GET[ Change ] ) ) {$pass_new $_GET[ password_new ]; // 获取用户输入的新密码$pass_conf $_GET[ password_conf ]; //获取用户输入的确认密码// Do the passwords match?if( $pass_new $pass_conf ) { …

网络地址相关函数一网打尽

这块的函数又多又乱&#xff0c;今天写篇日志&#xff0c;以后慢慢补充 1. 网络地址介绍 1.1 ipv4 1.1.1 点、分十进制的ipv4 你对这个地址熟悉吗&#xff1f; 192.168.10.100&#xff0c;这可以当做一个字符串。被十进制数字、 “ . ”分开。IP地址的知识就不再多讲…

一文速学-selenium高阶操作连接已存在浏览器

前言 不得不说selenium不仅在自动化测试作为不可或缺的工具&#xff0c;在数据获取方面也是十分好用&#xff0c;能够十分快速的见到效果&#xff0c;这都取决于selenium框架的足够的灵活性&#xff0c;甚至在一些基于web端的自动化办公都十分有效。 通过selenium连接已经存在…

【解决】No match for argument: gflags-devel

背景 在centos-8中安装gflags-devel&#xff0c;直接dnf安装&#xff0c;失败了。 [rootpcs2 ~]# sudo dnf -y install gflags-devel Extra Packages for Enterprise Linux 8 - x86_64 Extra Packages…

SpringBoot整合RabbitMQ快速实战

目录 引入依赖 配置文件 不同模式下使用springboot收发消息 直连模式 生产者 消费者 Fanout模式 生产者 消费者 Topic主题模式 生产者 消费者 Headers模式 生产者 消费者 补充Quorum队列 生产者 消费者 引入依赖 <dependency><groupId>org.springf…

什么是Vue Vue入门案例

一、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架 Vue2官网&#xff1a;Vue.js 1.什么是构建用户界面 基于数据渲染出用户可以看到的界面 2.什么是渐进式 所谓渐进式就是循序渐进&#xff0c;不一定非得把V…

华为radius认证

组网需求 如图1所示&#xff0c;用户同处于huawei域&#xff0c;Router作为目的网络接入服务器。用户需要通过服务器的远端认证才能通过Router访问目的网络。在Router上的远端认证方式如下&#xff1a; Router对接入用户先用RADIUS服务器进行认证&#xff0c;如果认证没有响应…

(M)UNITY三段攻击制作

三段攻击逻辑 基本逻辑&#xff1a; 人物点击攻击按钮进入攻击状态&#xff08;bool isAttack&#xff09; 在攻击状态下&#xff0c; 一旦设置的触发器&#xff08;trigger attack&#xff09;被触发&#xff0c;设置的计数器&#xff08;int combo&#xff09;查看目前攻击…

【美团】无人机-大数据开发工程师

更新时间&#xff1a;2024/01/29 工作地点&#xff1a;北京市 事业群&#xff1a;到家事业群 工作经验&#xff1a;3年 部门介绍 为了更好地提升城市即时配送的效率与体验&#xff0c;美团于2017年启动了无人机配送服务的探索&#xff0c;通过科技创新推动履约工具变革&#x…

基于JAVA+SpringBoot+Vue的前后端分离的美食分享推荐平台2

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在当今社会&#xff0…

代码随想录算法训练营day35 || 860.柠檬水找零,406. 根据身高重建队列,452. 用最少数量的箭引爆气球

视频讲解&#xff1a; 贪心算法&#xff0c;看上去复杂&#xff0c;其实逻辑都是固定的&#xff01;LeetCode&#xff1a;860.柠檬水找零_哔哩哔哩_bilibili 贪心算法&#xff0c;不要两边一起贪&#xff0c;会顾此失彼 | LeetCode&#xff1a;406.根据身高重建队列_哔哩哔哩_b…

自然语言处理(NLP)技术使用

自然语言处理&#xff08;NLP&#xff09;技术使用 以下是一些自然语言处理&#xff08;NLP&#xff09;技术的例子&#xff1a;以上只是一些NLP技术的例子&#xff0c;还有许多其他的技术和应用&#xff0c;如文本分类、文本生成、问答系统等。NLP技术的发展正逐渐改变人们与计…

手撕红黑树

目录 性质 插入规则 调整方法 插入在grandfather的左子树 uncle存在为红色&#xff08;变色&#xff09; uncle不存在或存在为黑色&#xff08;旋转变色&#xff09; 插入在grandfather的右子树 uncle存在且为红色&#xff08;变色&#xff09; uncle不存在或者存在为黑…

Whatsapp 相关(七) -网络请求

本篇主要用来完善上篇文章 frida 监测网络请求的. whatsapp相关(五)- frida监测网络请求 1: 脚本 本次的脚本与上次的区别是,之前只能输出请求的地址,本次优化后,可输出请求参数,结果等. 代码如下: Java.perform(function () {var HttpURLConnection Java.use(java.net.H…

Bean 的作用域有哪些?

Spring 中 Bean 的作用域通常有下面几种&#xff1a; singleton : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的&#xff0c;是对单例设计模式的应用。prototype : 每次获取都会创建一个新的 bean 实例。也就是说&#xff0c;连续 getBean() 两次&#x…

Vue之初识路由

路由有什么用&#xff1f; 在我们修改地址栏路径时&#xff0c;切换显示匹配的组件 VueRouter的使用(5 2) 5个基础步骤(固定) 1.下载:下载 VueRouter模块到当前工程&#xff0c;版本3.6.5 yarn add vue-router3.6.5 npm i vue-router3.6.52.引入 import VueRouter from v…

如何在DBeaver中重命名数据库

前言 DBeaver是一款强大的开源通用数据库管理和开发工具&#xff0c;支持多种数据库类型。在某些数据库系统中&#xff0c;你可以直接通过DBeaver的图形界面来重命名数据库名称。本文将详细介绍如何在DBeaver中进行数据库重命名操作。 重要提示&#xff1a; 对于不同的数据库…

15EG使用vivado2021.1实现LWIP的网络传输

创建工程模板在hello_world中已经介绍过了&#xff0c;这里直接从配置完zynq ip核开始&#xff0c;由于使用vivado的版本不同&#xff0c;配置ZYNQ时需要用到的tcl文件我会放在工程文件夹下的file文件夹中 配置好IP核后&#xff0c;右键设计模块&#xff0c;点击Generate Outpu…