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

二维数组函数调用

输入设备-------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.hqwc.cn/news/439906.html

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

相关文章

使用 Node.js 和 Cheerio 爬取网站图片

写一个关于图片爬取的小案例 爬取效果 使用插件如下&#xff1a; {"dependencies": {"axios": "^1.6.0","cheerio": "^1.0.0-rc.12","request": "^2.88.2"} }新建一个config.js配置文件 // 爬取图片…

Error: error:0308010C:digital envelope routines::unsupported

错误解决 前言&#xff1a;一般npm报错解决常见的npm 和node 版本对应关系 1、报错详情&#xff1a;2、原因分析&#xff1a;3、解决方案&#xff1a;3.1 更改系统环境变量3.2 更改项目环境变量来解决3.3 更换NodeJs版本来解决 前言&#xff1a; 一般npm报错解决 npm 17之后版…

数据结构3、基于栈的后缀算术表达式求值

1 题目描述 图1 中缀表达式转化为后缀表达式题目描述 图2 基于栈的后缀算术表达式求值题目描述 2 题目解读 借助一个运算符栈&#xff0c;可将中缀表达式转化为后缀表达式&#xff1b;借助一个运算数栈&#xff0c;可对后缀表达式求值。借助一个运算符栈和一个运算数栈&#xf…

【BUG】golang gorm导入数据库报错 “unexpected type clause.Expr“

帮同事排查一个gorm导入数据报错的问题 事发现场 ck sql CREATE TABLE ods_api.t_sms_jg_msg_callback_dis (app_key String DEFAULT COMMENT 应用标识,callback_type Int32 DEFAULT 0 COMMENT 0送达&#xff0c;1回执,channel Int32 DEFAULT 0 COMMENT uid下发的渠道,mode…

文献速递:人工智能医学影像分割--- 深度学习分割骨盆骨骼:大规模CT数据集和基线模型

文献速递&#xff1a;人工智能医学影像分割— 深度学习分割骨盆骨骼&#xff1a;大规模CT数据集和基线模型 我们为大家带来人工智能技术在医学影像分割上的应用文献。 人工智能在医学影像分析中发挥着至关重要的作用&#xff0c;尤其体现在图像分割技术上。这项技术的目的是准…

Blender教程(基础)-面的细分与删除、挤出选区-07

一、Blender之面的细分 新建一个立方体&#xff0c;在编辑模式下、选中一个面。 在选中的面上单击右键弹出细分选项&#xff0c;选择细分。 在选中细分后、会默认细分1次。修改细分次数在左下角 二、Blender之面的删除 选择中需要操作的面&#xff0c;在英文状态下按X键弹…

51单片机通过级联74HC595实现倒计时秒表Protues仿真设计

一、设计背景 近年来随着科技的飞速发展&#xff0c;单片机的应用正在不断的走向深入。本文阐述了51单片机通过级联74HC595实现倒计时秒表设计&#xff0c;倒计时精度达0.05s&#xff0c;解决了传统的由于倒计时精度不够造成的误差和不公平性&#xff0c;是各种体育竞赛的必备设…

minio2023版本安装对象存储文件迁移

一、环境 minio版本&#xff1a;minio-20230320201618.0.0.x86_64.rpm 二、安装 将下载好的rpm包放在文件夹下&#xff0c;然后cd到该目录 sudo rpm -ivh minio-20230320201618.0.0.x86_64.rpm 三、启动 1、minio的位置 which minio cd /usr/local/bin 2、启动 &#xff08;可…

负载均衡下的webshell连接

一、环境配置 1.在Ubuntu上配置docker环境 我们选择用Xshell来将环境资源上传到Ubuntu虚拟机上&#xff08;比较简单&#xff09; 我们选择在root模式下进行环境配置&#xff0c;先将资源文件复制到root下&#xff08;如果你一开始就传输到root下就不用理会这个&#xff09; …

MySQL安装部署-集群版

MySQL支持主从复制策略&#xff0c;本文主要描述读写分离集群的安装部署。 如上所示&#xff0c;MySQL数据库的主从复制策略中&#xff0c;主数据库Master同步binary log中的数据到从数据库Slave A以及从数据库Slave B&#xff0c;主数据库Master可提供写服务以及部分读服务、从…

Netty核心——Reactor下篇(十)

任务队列中的Task有3种典型使用场景 用户程序自定义的普通任务 比如有一个非常耗时长的业务 异步执行提交该Channel对应的NioEventLoop的TaskQueue中 用户自定义定时任务 该任务提交到scheduleTaskQueue中 非当前Reactor线程调用Channel的各种方法 例如在推送系统的业务线程…

iOS 17.4 苹果公司正在加倍投入人工智能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…