嵌入式学习的第十二天-函数

一、数组作为函数参数

     1.二维数组作为函数参数传递,行数无法直接使用,可以在主函数中写好传递过去,列数必

         须写死

     2.数组名可以作为函数参数,此时形参应当用数组名或用指针变量

     3.实参数组与形参数组类型应一致

     4.数组名作为函数实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素的地址

         传递给形参数组

二、标识符的作用域和可见性问题

      1. 作用域:标识符生存的范围

        局部作用域:在{}里,局部变量,从定义生效开始到花括号结束;函数形参也具有局部作用域

        全局作用域:在{}外,全局变量(g_a),从定义生效开始到本文件结束;

   2.可见性:程序在运行到某一点时是否可以对标识符进行访问

       1) 标识符必须先定义再使用

       2) 在同一作用域中不得定义同名标识符

       3) 在没有包含关系的不同作用域中定义同名标识符互不影响

       4) 在两个或多个具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见(就

             近原则)

三、全局变量和局部变量

       1.全局变量作用:实现函数的传参

       2.全局变量在静态区或全局区,没有对其初始化,在开辟空间自动清零

       3.局部变量在栈区,没有对其初始化,直接打印时值为随机值

四、变量的生存期

       1.静态生存期:这个变量的生存期和程序运行周期相同;静态生存期为其包括全局变量或静

        态局部变量static int s_i(把s_i的空间由动态改为静态,在main函数第一条语句之前已经开好

        空间了,有静态生存期,但是有局部作用域)

       2.动态生存期:局部变量具有动态生存期;在栈区就具有动态生存期变量的存储类别划分

五、变量的存储类别

        1.auto变量(自动型存储)

         局部变量前,默认时auto,表示该变量的开辟、销毁是自动的;将变量存放在栈区中

        2.static(静态存储)

        1)静态变量,在局部变量前使用,把局部变量的生存期变为静态生存期;

        2)在全局变量或者函数前加stadic不是为了改静态生存期,而是限制这个变量或者函数只

              在、当前.c文件使用,其他文件一概不能使用

        3.register(寄存器存储)

           在定义一个变量前可加register,这这个变量就被称为寄存器,为了提高对变量的读写度;

           考点:

regist int i;
int *p;
p=&i,

           会导致编译报错,register定义的变量是不可被寻址的

        4.extern(外部存储)

        声明一个变量是外部存储的变量/函数

        “:vsp 文件名.c”   左右分屏

        “:sp 文件名.c”     上下分屏

         若在main.c 中调用fun.c,编译时 gcc main.c fun.c

         头文件只声明,不放定义/函数

        在fun.h中声明 extern int add(int a,int b),在main.c中写#include“fun.h”

        :set mouse = a 鼠标左右切换

五、例题

1.求边框值求和

int  sumOfArray2D(int a[][4],int rows)
{
	int cols = sizeof(a[0]) / sizeof(a[0][0]);
	int i,j;
	int sum = 0;
	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			if(0 == i || 0 == j || rows - 1 == i || cols - 1 == j)
			{
				sum += a[i][j];
			}
		}
	}
	return sum;
}

2.二维数组镜像翻转

void reverse2D(int a[][4],int rows)
{
	int i,j;
	int cols = sizeof(a[0]) / sizeof(a[0][0]);
	for(i = 0;i < rows;++i)
	{
		reverse(a[i],cols);
	}
}

void reverse(int a[],int len)
{
	int i;
	for(i = 0;i < len /2;++i)
	{
		int t = a[i];
		a[i] = a[len - i -1];
		a[len - i -1] = t;
	}
}

3.二维数组求最大值

void maxOfStrings(char s[][100],int rows,char max[])
{
	int i = 0;
	strcpy(max,s[0]);
	for(i = 1;i < rows;++i)
	{
		if(strcmp(max,s[i]) < 0)
		{
			strcpy(max,s[i]);
		}
	}
}

4.二维数组的逆序

void reverseStrings(char s[][100],int rows)
{
	int i;
	for(i = 0;i < rows / 2;++i)
	{
		char t[100];
		strcpy(t,s[i]);
		strcpy(s[i],s[rows - i -1]);
		strcpy(s[rows - i - 1],t);
	}

}

5.二维数组的排序

void sortStrings(char s[][100],int rows)
{
	int i,j;
	for(i = 0;i < rows - 1;++i)
	{
		for(j = i + 1;j < rows;++j)
		{
			if(strcmp(s[i],s[j]) > 0)
			{
				char t[100];
				strcpy(t,s[i]);
				strcpy(s[i],s[j]);
				strcpy(s[j],t);
			}
		}
	}
}

6.二维数组的查找

nt  binaryFindStrings(char s[][100],int rows,char n[])
{
	int begin = 0;
	int end = rows - 1;
	int mid;
	while(begin <= end)
	{
		mid = (begin + end) / 2;
		int ret = strcmp(s[mid],n);
		if(ret > 0)
		{
			end = mid - 1; 
		}
		else if(ret < 0)
		{
			begin = mid + 1;
		}
		else
		{
			return mid;
		}
	}

		return -1;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值