Day 11 函数参数、局部变量和全局变量

目录

函数参数

(1)一维整型数组做函数参数

(2)一维字符型数组做函数参数

(3)二维整型数组做函数参数

(4)二维字符数组做函数参数

 局部变量和全局变量

局部变量

全局变量

存储类别的关键字


函数参数

用数组名作函数参数,此时形参应当用数组名或用指针变量。
(1) 用数组名作函数参数,应该在主调函数和被调用函数分别定义数组。
(2) 实参数组与形参数组类型应一致(今都为 float 型),如不一致,结果将出错。
(3) 在被调用函数中声明了形参数组的大小,但在实际上,指定其大小是不起任 何作用的,因为语言编译对形参数组大小不做检查,只是将实参数组的首元素的地址传给形参数组。因此,形参数组名获得了实参数组的首元素的地址
(4) 形参数组可以不指定大小,在定义数组时在数组名后面跟一个空的方括号。
(5) 用数组名作函数实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素的地址传递给形参数组,这样两个数组就共占同一段内存单元。

(1)一维整型数组做函数参数

形参  -----  数组形式 + 数组长度 

int sum (int a[])

实参  -----  数组名    + 数组长度 

int a[5];

 (2)一维字符型数组做函数参数

        一维字符型数组 --- 用来存放字符串 。因为处理的是字符串数据,字符串操作的依据,主要看结束标志 '\0',而不是数组长度

   形参  数组形式

(1)void Puts(char *s)    //两种表达形式都可以

(2)void Puts(char s[])

实参  数组名 

char s2[100];

示例代码: 

#include<stdio.h>

void Puts(char s[])
{
	int i = 0;
	while(s[i] != '\0') //判断字符串结束标志,循环停止
	{
		printf("%c",s[i]);
		++i;
	}
	putchar('\n');
}

int main(void)
{
	char s[100] = "world";
     
    Puts(s); //函数调用

	return 0;
}

运行结果:

world

(3)二维整型数组做函数参数

形参   --- 二维数组形式 + 行数   (本质 一维数组 + 长度)

int sum(int (*a)[4],int row)        // int row = sizeof(a)/sizeof(a[0]);求行数

实参   --- 数组名       + 行数    

int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

示例代码:

#include<stdio.h>

void printArray(int (*a)[4],int row)
{
	int i,j;

	for(i = 0;i < row; ++i)
	{
		for(j = 0;j < 4;++j)
		{
			printf("%02d ",a[i][j]);
		}
		putchar('\n');
	}
}


int main(void)
{
	int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

	int row = sizeof(a)/sizeof(a[0]);

	printArray(a,row);

	return 0;
}

 运行结果:

01 02 03 04 
05 06 07 08 
09 10 11 12 
13 14 15 16 

(4)二维字符数组做函数参数

   注意:
      ①不要和一维字符型数组传参搞混 
         一维字符型数组,主要用来存放字符串数据 
         而字符串数据有结束标志('\0'),故,传参时,不需要传长度 
      ②二维字符型数组,用来存储多个字符串
       要操作时,往往都是操作多个字符串,而多个字符串没有所谓结束的标志,要看的是数组长           度 (即行数)。
 

 形参   ----- 二维数组形式 + 行数    (本质 一维数组 + 长度)

void printStr(char s[][10],int row)

 实参   ----- 数组名            + 行数    

char s[4][10];

示例代码:

#include<stdio.h>
#include<string.h>

void printStr(char s[][10],int row)
{
	int i;
	for(i = 0;i < row;++i)
	{
		puts(s[i]);
	}
}

int main(void)
{
	char s[4][10] = {"aaa","bbb","ccc","ddd"};
	int row = sizeof(s)/sizeof(s[0]);

	printStr(s,row);

	return 0;
}

 运行结果:

aaa
bbb
ccc
ddd

 局部变量和全局变量

标识符 的作用域与可见性问题:

作用域
      名字作用的访问 

     局部作用域 :
           { 
            }  //花括号范围内就叫局部作用域 

           在局部作用域定义的变量 --- 局部变量 
           在全局作用域定义的变量 --- 全局变量 

    全局作用域 :
           不在 任何一个 {} 范围之内 
可见性 
      程序运行到某一个位置 哪些名字可以被使用(被看见)

局部变量

        在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。
       特点:
                局部变量空间-----一般都开栈上 
                如果不初始化,局部变量中的值是随机值(垃圾值)

      局部变量的生命周期:
             从程序运行到定义处开始存在,到程序运行到它作用范围结束时,销毁

 

全局变量

       在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
       特点:
                全局变量空间-----全局区
                如果不初始化,默认初始化为0
       全局变量(静态变量)的生命周期
              从程序开始运行时就存在了,直到整个程序运行结束时,销毁 



      注意:
             
全局变量和静态变量,不能用"变量"进行初始化。
 

标识符的可见性的规则:
①先定义,后使用 。
②同一作用域中,不能有同名标识符。
③在不同的作用域,同名标识符,相互之间没有影响。
④如果是不同的作用域,但是作用域之间存在嵌套关系, 则内层的作用域的同名标识符,会屏蔽外层的作用域的同名标识符。 (就近原则) 

存储类别的关键字

 定义格式一般为:    [存储类别] 类型 变量名;  

(1)auto   :表示它是一个自动变量 (局部变量)  ---  自动申请 自动释放 

(2)static  :static 修饰局部变量  此时会被放在全局区(静态区),局部变量的生命周期被延长 。
                        注意:
                                 ① static 修饰局部变量 --只会被初始化一次 
                                 ② static 修饰的变量 -- 具有继承性
                                 ③ static 修饰的变量 -- 只能用常量初始化 (不能用变量初始化)
         变量 
                   局部变量 ----- 表示将局部变量存放到静态区,延长声明周期,存在静态区的变量。
                   a.不能用变量初始化 
                   b.只会被初始化一次 
                   c.反复使用该变量时,值具有继承性。
                   全局变量 ----- 限定作用域为本文件,别的文件不能通过extern来声明使用 
         函数     
                   限定作用域为本文件,别的文件不能通过extern来声明使用 

(3)register  :寄存器 ,表示把变量存储寄存器中 。register 修饰的变量 ,不能做 & (取地址)。

(4)extern  : 外部的 ----- 表示变量是存在外部的(可用于多文件编程)。不在当前文件中,只                             能声明全局变量 。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值