学习嵌入式的第十二天-------二维数组函数的调用和指针的运算

二维数组函数调用

输入设备-------cpu------输出设备

                          |
                         V

                       存储器

总线:

总线宽度:32位或64位

(1.数据总线2.控制总线3.地址总线)


练习:
  定义一个二维整型数组,实现一个函数,
  对二维数组元素求和

#include <stdio.h>int Sum(int a[][4],int row)      //数组求和函数
{int sum=0;int i=0;int j=0;for (i=0;i<row;++i){for (j=0;j<4;++j){sum+=a[i][j];}}return sum;
}int main(void)
{int sun=0;int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int row = sizeof(a)/sizeof(a[0]);int sum = Sum(a,row);printf("sum=%d\n",sum);return 0;
}

二维字符型数组做函数形参:

char s[3][10]= { "hello", "world" , "china" };
形式上:
void printStr(char s[][10] ,int row)//注意需要传行数,因为操作多个字符串
本质上:
void printStr(char (*s)[10] ,int row)

实参:
printStr(s,row); //数组名 行数


练习:
准备3个字符串
实现函数找出最大值

#include <stdio.h>int  printStr(char s[][10],int row)         //二维字符数组求最大字符串的函数
{int i=0;char Max[10]=s[0][10];for (i=1;i<row;++i){while(s[i][10]!=0){if(Max<s[i][10]){Max[10]=s[i][10];}}}return puts(Max);}int main (void)
{char s[3][10]={"hello","wrold","spiol"};printStr(s,3);printf("Max=%s\n",printStr(s,3));return 0;
}

准备3个字符串排序

#include <stdio.h>void Paixu(char s[][10],int row)   //利用冒泡法排序函数
{int i=0;int j=0;for (i=0;i<row;++i){for (j=i+1;j<row;++j){if (s[j][10]>s[j+1][10]){char t[10];strcpy(t,s[j]);strcpy(s[j],s[j+1]);strcpy(s[j+1],t);}}}}int main (void)
{char s[3][10]={"world","hello","apple"};Paixu(s,3);int i=0;for (i=0;i<3;++i){printf("%s\n",s[i]);}return 0;
}

标识符   作用域    可见性问题

作用域:

作用的范围

               局部变量-------一定在某一个{}范围内

               全局变量-------不在主函数和一个{}范围内

可见性:

程序运行到某个点 那些标识符可见


标识符的可见性的规则:

  1.先定义,后使用 
  2.同一作用域中,不能有同名标识符
  3.在不同的作用域,同名标识符,相互之间没有影响 
  4.如果是不同的作用域,
    但是作用域之间存在嵌套关系,
    则,
    内层的作用域的同名标识符,会屏蔽外层的作用域的同名标识符。
    (就近原则) 

时间上去区分:

     动态变量(局部变量-空间是开辟在栈上的--自动申请自动释放) (声明周期):
     从定义的语句开始,到所在的作用域范围结束 
     eg:
        栈上的 局部变量 
   静态变量 (全局变量)
     从程序一开始运行,就存在,
     直到程序结束时,销毁 
     eg:
        全局变量 
        static 局部变量 
     注意:
       全局变量(静态变量) --- 此时,
      1.不能用变量进行初始化,只能常量初始化 

      2.静态区的变量  只会被初始化一次 

      3.值具有 继承性

auto int a;        //这个是一个自动变量 --- 栈上开辟的变量 

 static int a;     //静态区 
                        //修饰的是 局部变量 

 register int a;   //CPU 寄存器  
                         //建议性 
                         考点:
                         
1.不能 对其修饰的变量& (取地址)因为寄存器不能通过地址直接访问。

                         2.不能对register变量进行初始化,也就是,在声明时不能赋初值。

                        3.编译器可能会忽略你的声明。

                       4.其实,现在的计算机处理器已经有极高的并行处理能力,内存访问的速度并不是很慢,有时可能并不需要register声明。


register int i;     //给程序加速               
for( i = 0; i < 100000000; ++i)
{
}   

 extern int a;      //扩展 延伸 
                          //表示 此时这个a 不是在当前文件中定义的 ,
                          //如果要用,请到别的文件中寻找
                          //多文件编程 
                          //一般使用在多文件编程中:
                          //如果想在当前文件使用别的文件中的 全局变量 ,
                          //此时,可以使用
                          //extern int a; //做声明 
                          //相当于,把别的文件中的变量作用域扩展到当前文件   

//全局变量前面 
  static 修饰局部变量
             //将局部变量 存储在了 全局区(静态区)
             //将局部变量的生命周期延长 

  static 修饰全局变量
             //表示 将全局变量 的作用域限定到本文件中 
             //别的文件中不能extern了     

  extern 可以放在函数声明中  --函数声明 
            //表示的意思 --将函数作用域扩展到当前文件

  static 加在函数前面 
            //  此时效果与修饰全局变量效果一样 
            // 将函数作用域限定到本文件中

面试题:
  1.你知道static吗?    
  


指针

定义

访问内存地址 操控硬件

指针:

指针+基本数据据类

指针+数组

指针+函数

指针+指针

1.指针:就是地址-----就是内存的单元的编号

2.指针变量

语法:

基类型*  指针变量名;

基类型-------数据类型//基础数据类型 //数组类  //基类型表示指针变量  指向的目标的数据类型

* --------表示此时定义的白变量是一个指针类型的变量

指针变量名------标识符命名规则+见名知意

int *p;//表示定义了一个指针类型的变量

int *p = &a;   //指针变量 p 指向 了 int型变量a    

p变量的数据类型 int *   //指针类型 

&b --地址值 ---类型? 
      float 
      b有一块内存空间 -- 放的是float类型的数据 
      &b ---得到了一块 存放着 float类型数据的 空间的地址 

指针访问变量

间接访问 通过地址访问到的 

指针的运算

* 指针运算符
* 单目运算 
 运算数必须是指针类型的值(地址)
  *p 过程
 1.首先拿出p指针变量中的值(地址) 到内存中定位 
 2.从定位处开始,偏移出sizeof(基类型)大小的一块空间 
 3.把这块空间当做一个 基类型的 变量来看  

想实现:
被调修改主调 
1.想修改谁,就把谁的地址传过去 
2.必须要做*运算(间接访问),实现修改 

练习:
   求两个数的和 --函数 
   int add(int a,int b)
   {
      return a + b; //只能带出一个结果 
   }

#include <stdio.h>void Sum(int a,int b,int *sum)   //  指针求和函数
{*sum=*a + *b;return ;
}int main (void)
{int a=2;int b=3;int sum=0;Sum(&a,&b,&sum);printf("sum=%d\n",sum);return 0;
}

练习:
    找出两个数中最大值 最小值 

#include <stdio.h>void compure(int a,int b,int *max,int *min)    //比较函数
{if (a>b){*max=a;*min=b;}else{*max=b;*min=a;}
}int main(void)
{int a=0;int b=0;int max=0;int min=0;scanf("%d%d",&a,&b);compure(a,b,&max,&min);printf("MAX=%d\n",max);printf("MIN=%d\n",min);
}

练习:
    main函数中有两个数据
    交换a b的值

#include <stdio.h>void jiaohuan(int *a,int *b)     //换位函数
{int c=*a;*a=*b;*b=c;
}int main(void)
{int a=0;int b=0;printf("a=");scanf("%d",&a);printf("b=");scanf("%d",&b);jiaohuan(&a,&b);printf("a=%d \nb=%d\n",a,b);return 0;

指针 + 数组 

一维整型数组 

int a[5];   //a首元素的地址 
              //a[0]  -- int型 
             //&a[0] -- int * 

int *p = &a[0];
           = a;          

a[i] <=> *(a+i) //指针运算

练习:
     找最大值 ,指针的方式访问  

#include <stdio.h>int Max(int *p,int len)     // 擂台法求最大值函数
{int i=0;int t=*p;for (i=1;i<len;++i){if (*(p+i)>t){t=*(p+i);}}return t;
}int main (void)
{int a[10]={6,5,12,3,4,98,10};int *p=a;int q=Max(a,10);printf("Max=%d\n",q);return 0;
}

作业

1.通过指针,实现数组逆序

#include <stdio.h>void Reverse_order(int *p,int len)     //数组逆序函数
{int i=0;int j=0;for (i=0;i<len/2;++i){int t=0;t=*(p+i);*(p+i)=*(p+len-1-i);*(p+len-1-i)=t;}
}int Input(int *p,int len)                   //输入数组元素函数
{printf("Enter a number: \n");int i=0;for (i=0;i<len;++i){scanf("%d",&*(p+i));}
}void Print (int *p,int len)             //输出数组元素函数
{int i=0;while(i<len){printf("%d ",*(p+i));++i;}putchar('\n');
}int main(void)
{int n=0;printf("Input number: \n");       //输入数组项数scanf("%d",&n);int a[n];int *p=a;Input(a,n);Reverse_order(a,n);Print(a,n);return 0;}

2.排序

#include <stdio.h>void Array_sorting(int *p,int len)           //用指针进行数组的插入排序函数
{int i=0;int j=0;for (i=0;i<len;++i){int t=*(p+i);j=i;while(j>0 && *(p+j-1 )>t){*(p+j)=*(p+j-1);--j;}*(p+j)=t;}}int Input(int *p,int len)                   //输入数组元素函数
{printf("Enter a number: \n");int i=0;for (i=0;i<len;++i){scanf("%d",&*(p+i));}
}void Print (int *p,int len)             //输出数组元素函数
{int i=0;while(i<len){printf("%d ",*(p+i));++i;}putchar('\n');
}int main(void)
{int n=0;printf("Input number: \n");       //输入数组项数scanf("%d",&n);int a[n];int *p=a;Input(a,n);Array_sorting(a,n);Print(a,n);return 0;}

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

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

相关文章

KAFKA高可用架构涉及常用功能整理

KAFKA高可用架构涉及常用功能整理 1. kafka的高可用系统架构和相关组件2. kafka的核心参数2.1 常规配置2.2 特殊优化配置 3. kafka常用命令3.1 常用基础命令3.1.1 创建topic3.1.2 获取集群的topic列表3.1.3 获取集群的topic详情3.1.4 删除集群的topic3.1.5 获取集群的消费组列表…

尝试搭建域

使用window 7 作为dmz 主机 server_2008 作为 预控 前提两台主机都在同一个LAN 下&#xff08;设置一个LAN 区域&#xff09;&#xff0c;同样防火墙关闭状态 首先搞定server 2008 中的域 1. 在计算机属性中选择更改设置中将主机名修改一下&#xff1a; 2. 在server 2008 中…

代码随想录 Leetcode222.完全二叉树的节点个数

题目&#xff1a; 代码&#xff08;首刷自解 2024年1月30日&#xff09;&#xff1a; class Solution { public:int countNodes(TreeNode* root) {int res 0;if (root nullptr) return res;queue<TreeNode*> deque;TreeNode* cur root;deque.push(cur);int size 0;w…

编译opencv4.6问题汇总,第三方软件包见我发的资源

win10系统 python3.8.2&#xff0c;cmake-3.15.5-win64-x64&#xff0c;opencv4.6 编译方式见&#xff1a;OpenCV的编译 - 知乎 本文主要总结问题。赠人玫瑰手留余香。 问题1 Problem with installing OpenCV using Visual Studio and CMake (error code: MSB3073) 解决方法…

Java 字符串 07 练习-手机号屏蔽、身份证号信息查看,游戏骂人敏感词替换

注意点&#xff1a;只有返回值才是被截取的小串&#xff0c;所以需要有一个变量去承接它&#xff1b; 自己写的代码&#xff1a; import java.util.Scanner; public class practice {public static void main(String[] args) {Scanner input new Scanner(System.in);String …

Walrus 实用教程|Walrus + Gitlab,打通CI/CD 自动化交付!

Walrus file 是 Walrus 0.5 版本推出的新功能&#xff0c;用户可以通过一个非常简洁的 YAML 描述应用或基础设施资源的部署配置&#xff0c;然后通过 Walrus CLI 执行 walrus apply或在 Walrus UI 上进行import&#xff0c;将 Walrus file 提交给 Walrus server&#xff0c;由 …

【Python笔记-设计模式】单例模式

一、说明 单例是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 (一) 解决问题 维护共享资源&#xff08;数据库或文件&#xff09;的访问权限&#xff0c;避免多个实例覆盖同一变量&#xff0c;引发程序崩溃。 …

多线程c++

目录 1.join和detach区别 2.lock_guard和unique_lock 3.原子操作 4.条件变量condition_variable 5.future 和 promise 1.join和detach区别 ①不使用join和detach #include <iostream> #include <thread> #include <windows.h>using namespace std;v…

docker由浅入深

一、什么是docker docker 顾名思义就是轮船的意思&#xff0c;轮船我们知道是通过集装箱运载货物的东西&#xff0c;那么docker其实也是类似的东西&#xff0c;只是装载的是虚拟的运行程序罢了。其中集装箱在docker里面被称为container&#xff08;后面以容器称之&#xff09;…

彻底解决 MAC Android Studio gradle async 时出现 “connect timed out“ 问题

最近在编译一个比较老的项目&#xff0c;git clone 之后使用 async 之后出现一下现象&#xff1a; 首先确定是我网络本身是没有问题的&#xff0c;尝试几次重新 async 之后还是出现问题&#xff0c;网上找了一些方法解决了本问题&#xff0c;以此来记录一下问题是如何解决的。 …

Python(19)Excel表格操作Ⅰ

目录 导包 读取EXCEL文件 1、获取worksheet名称 2、设定当前工作表 3、输出目标单元格数据 4、工作表.rows&#xff08;行&#xff09; 5、工作表.columns&#xff08;列&#xff09; 小结 导包 要想使用 python 操作 Excel 文件&#xff0c;应当导入 openpyxl 包。在…

上位机图像处理和嵌入式模块部署(视频处理vs图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 从目前发展的情况来看&#xff0c;视频处理会慢慢变成一种主流趋势。这里面的原因很多&#xff0c;比如说现在嵌入式soc的算力越来越强、获取图像的…

【环境配置】安装了pytorch但是报错torch.cuda.is_availabel()=Flase

解决思路&#xff1a;import torch正常&#xff0c;说明torch包安装正常&#xff0c;但是不能和gpu正常互动&#xff0c;猜测还是pytroch和cuda的配合问题 1.查看torch包所需的cuda版本 我的torch是2.0.1&#xff0c;在现在是比较新的包&#xff0c;需要12以上的cuda支持&…

鸿蒙首批原生应用!无感验证已完美适配鸿蒙系统

顶象无感验证已成功适配鸿蒙系统&#xff0c;成为首批鸿蒙原生应用&#xff0c;助力鸿蒙生态的快速发展。 作为全场景分布式操作系统&#xff0c;鸿蒙系统旨在打破不同设备之间的界限&#xff0c;实现极速发现、极速连接、硬件互助、资源共享。迄今生态设备数已突破8亿台&…

.net core 6 集成 elasticsearch 并 使用分词器

1、nuget包安装NEST、安装elasticsearch、kibana、ik分词器、拼音分词器 2、创建操作对象 //索引库 static string indexName "testparticper"; //es 操作对象 ElasticClient elasticClient new ElasticClient(new ConnectionSettings(new Uri("http://192.…

redis面试

0.思维导图 1. redis的数据类型♥♥♥ redis有五种数据类型&#xff0c;包括string,list,set,hash,zset;string就类似于java中的字符串&#xff0c;list就类似于Java中的列表&#xff0c;可以存放重复的元素&#xff0c;set就类似于java中的hashset&#xff0c;不能存放重复的…

索引文件的建立与查询示例(五)

隔了好几天没顾上更新内容&#xff0c;在此继续吧。还是得多动头脑&#xff0c;否则忙于日常事务&#xff0c;脑子不够灵活。在代码的世界里还是能有一些灵感。上次说到在内存中实现链表建立以及打印出链表的操作。这节我们试着将链表存入文件&#xff0c;并从文件中进行读取。…

关于maven项目构建的解释

在Idea中使用模块化构建项目 项目介绍&#xff1a; sky-server依赖sky-pojo和sky-common&#xff0c;继承sky-take-outsky-pojo继承sky-take-outsky-common继承sky-take-out 由于Idea编译器自动识别引入的模块&#xff0c;所以在Idea中可以运行项目。 在Idea中使用maven打包…

Java多线程--同步机制解决线程安全问题方式二:同步方法

文章目录 一、同步方法&#xff08;1&#xff09;同步方法--案例11、案例12、案例1之同步监视器 &#xff08;2&#xff09;同步方法--案例21、案例2之同步监视器的问题2、案例2的补充说明 二、代码及重要说明&#xff08;1&#xff09;代码&#xff08;2&#xff09;重要说明 …

用GPT写PHP框架

参考https://www.askchat.ai?r237422 写一个mvc框架 上面是简单的案例&#xff0c;完整的PHP框架&#xff0c;其核心通常包含以下几个关键组件&#xff1a; 1. 路由&#xff08;Routing&#xff09;&#xff1a;路由组件负责解析请求的URL&#xff0c;并将其映射到相应的控制…