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

news2024/11/14 13:55:13

二维数组函数调用

输入设备-------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.coloradmin.cn/o/1421949.html

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

相关文章

风水+起名测算小程序源码系统 带完整的安装代码包以及搭建教程

风水学是中国古老的一门学问&#xff0c;讲究人与自然的和谐&#xff0c;通过调整环境气场来影响人的运势和发展。而起名测算则是根据个人五行属性和命理特点&#xff0c;为其起一个好名字&#xff0c;以助其运势和发展。这两者结合&#xff0c;可以帮助用户更好地了解自己的命…

为什么每天上班明明没做什么体力活,却仍感觉到身体好累?

​为什么每天上班明明没做什么体力活&#xff0c;却仍感觉到身体好累&#xff1f; 在现代社会&#xff0c;许多人在工作中并不需要从事繁重的体力劳动&#xff0c;然而&#xff0c;他们却常常感到身体疲惫不堪。这种情况不仅发生在办公室工作的人群中&#xff0c;也普遍存在于…

前端Web开发

安装flask框架 pip install flask 导入flask模块 from flask import Flask 【可能遇到的问题】 出现了如下警告&#xff1a; WARNING: You are using pip version 21.2.4; however, version 22.0.4 is available.You should consider upgrading via the D:\Python\python…

java 社区资源管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web社区资源管系统是一套完善的java web信息管理系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.…

STM32低功耗模式概念

一、低功耗模式介绍 STM32 的低功耗模式有 3 种&#xff1a; 1)睡眠模式&#xff08;CM3 内核停止&#xff0c;外设仍然运行&#xff09; 2)停止模式&#xff08;所有时钟都停止&#xff09; 3)待机模式&#xff08;1.8V 内核电源关闭&#xff09; 在这三种低功耗模式中&#…

CGAL5.4.1 边塌陷算法

目录 1、使用曲面网格的示例 2、使用默认多面体的示例 3、使用丰富多面体的示例 主要对1、使用曲面网格的示例 进行深度研究 CGAL编译与安装CGAL安装到验证到深入_cgal测试代码-CSDN博客 参考资料CGAL 5.4.5 - Triangulated Surface Mesh Simplification: User Manual …

STM32通用定时器、计数器

时间记录&#xff1a;2024/1/30 一、时钟介绍&#xff08;TIM2-TIM5&#xff09; &#xff08;1&#xff09;通用定时器时钟频率介绍 内部时钟AHB为72MHz&#xff0c;经过APB1预分频器2分频变为36MHz&#xff0c;TIMxClk定时器时钟由时钟树可以看出&#xff0c;如果APB1预分…

力扣136、只出现一次的数字(简单)

1 题目描述 图1 题目描述 2 题目解读 在非空整数数组nums中&#xff0c;有一个元素只出现了一次&#xff0c;其余元素均出现两次。要求找出那个只出现一次的元素。 3 解法一&#xff1a;位运算 位运算&#xff0c;是一种非常简便的方法。 3.1 解题思路 异或运算&#xff0c;有…

PHP抽奖设置中奖率,以及防高并发

一、中奖率,先在后台设定好奖项名称,抽奖份数,以及中奖百分比 奖品表draw 二、 借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙" 阻塞(等待)模式,一般都是用这个模…

如何开通GitHub Copilot

GitHub Copilot 是由GitHub 和OpenAI共同开发的人工智能代码辅助工具&#xff0c;可以自动地生成高质量代码片段、上下文信息等。 通过自然语言处理和机器学习技术&#xff0c;能够通过分析程序员编写的代码、注释和上下文信息&#xff0c;自动生成代码&#xff0c;减轻程序员的…

Centos 7.9 在线安装 VirtualBox 7.0

1 访问 Linux_Downloads – Oracle VM VirtualBox 2 点击 ​the Oracle Linux repo file 复制 内容到 /etc/yum.repos.d/. 3 在 /etc/yum.repos.d/ 目录下新建 virtualbox.repo&#xff0c;复制内容到 virtualbox.repo 并 :wq 保存。 [rootlocalhost centos]# cd /etc/yum.rep…

【js逆向】scrapy基础

目录 一, 爬虫工程化 二, scrapy简介 三, Scrapy工作流程(重点) 四, scrapy安装 4.1 pip 安装 4.2 wheel安装 五, Scrapy实例 六, 自定义数据传输结构item 七, scrapy使用小总结 一, 爬虫工程化 在之前的学习中我们已经掌握了爬虫这门技术需要的大多数的技术点, 但是我…

vue使用json格式化

安装 npm i bin-code-editor -S // Vue2 npm install vue-json-viewer --save 在main.js引用 //引入bin-code-editor相关插件和样式 import CodeEditor from bin-code-editor; import bin-code-editor/lib/styles/index.css; import JsonViewer from vue-json-viewer //vue使用…

【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr

目录 1 -> 引用 1.1 -> 引用概念 1.2 -> 引用特性 1.3 -> 常引用 1.4 -> 使用场景 1.5 -> 传值、传引用效率比较 1.6 -> 值和引用作为返回值类型的性能比较 1.7 -> 引用和指针的区别 2 -> 内联函数 2.1 -> 概念 2.2 -> 特性 3 -…

布局管理和样式表

目录 手动操作 相关功能解释&#xff1a; Qt Designer或者QC中的Spacer控件及其属性 网格布局 代码操作 setFocusPolicy() 如果不进行布局&#xff0c;意味着界面上的东西都是写死的。 当我们进行布局操作之后&#xff0c;控件的位置、大小一般会根据窗口缩放来自动调整。…

计算机设计大赛 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

excel怎么设置密码?轻松保护您的工作表

在数字化时代&#xff0c;数据的安全性显得尤为重要。excel作为我们日常工作中广泛使用的办公软件&#xff0c;其中可能包含了大量的敏感数据。为了确保这些数据不被未授权的人访问&#xff0c;本文将为您详细介绍excel怎么设置密码&#xff0c;从而有效地保护您的数据安全。 方…

STM32F407ZGT6——实验9-4 通用定时器脉冲计数实验

一、配置路线 二、问题及反思 配置的时候误以为需要先把【输入捕获配置】了再去配置【从模式】&#xff0c;后面验证了这样配置没办法产生预期的效果。 代码如下&#xff1a;void gtim_timx_cnt_chy_init(uint16_t psc, uint16_t arr) void gtim_timx_cnt_chy_init(uint16_t…

全新魅思V20正规视频影视系统源码/APP+H5视频影视源码

全新魅思V20正规视频影视系统源码&#xff0c;APPH5视频影视源码。会员花费三千购入的&#xff0c;具体搭建教程放压缩包了&#xff01; 有兴趣的下载自行研究吧&#xff0c;搭建一共要用到3个域名&#xff0c;可以拿二级域名搭建。

企业级大模型的护城河:RAG + 微调

围绕LLM的炒作是前所未有的&#xff0c;但这是有道理的&#xff0c;生成式 AI 有潜力改变我们所知道的社会。 在很多方面&#xff0c;LLM将使数据工程师变得更有价值——这令人兴奋&#xff01; 不过&#xff0c;向老板展示数据发现工具或文本到 SQL 生成器的炫酷演示是一回事…