首页 > 其他分享 >函数(3)

函数(3)

时间:2024-05-24 21:01:58浏览次数:7  
标签:函数 形参 int --- 作用域 数组

函数与数组,数组作为函数参数:

1.函数传参 
  实参 赋值 给形参 

2.数组传参

形式上:
void printArray(int a[],int len); //形参1 表示要传的是数组这种数据 
                                  //形参2 要传的是数组的长度 (因为在函数传参后只能传入数组的地址,此时sizeof不能算出数组长度,而是结果为8(64位系统里的地址大小))

本质上:
void printArray(int a[],int len);
void printArray(int a[10],int len);
void printArray(int *a,int len); //指针变量 (接收地址这种数据)

调用时:
printArray(a,5)
printArray(&a[4],5); // a --- 数组名--代表值--数组首元素的地址 ---需要的是一个地址 
                     // a[i] //数组的下标运算 -- 本质上是个指针运算

如果是像&a[4]这样的方式传参,传递的是看做从a[4]开始,往后数10个元素的地址,显然,会发生越界a[11],a[12]未定义

注意:

  如果函数传的是数组,
  通过数组下标的访问方式,可以实现被调函数,修改 主调函数中的数据

一维字符型数组作为函数的参数:

注:
    和一维整型数组作为函数参数 方式是一样
    但是,它不需要传数组长度 (原因,是因为一维字符型数组中,主要处理的是字符串数据,
而字符串数据有自己的结束标志‘\0’)

二维数组做函数参数:

一般二维数组作为函数参数

形参:
     1. 写一个二维数组的形式 (行数可以省略,列数不能省略)

(列数相当于数据类型 int[列数4] a[],相当于此时数据类型是可以装4个int的数组)
     2. 需要传递行数 (sizeof失效)

实参:void print(int a[ ][4],int ranki)
     1.传数组名 
     2.传二维数组行数 

二维字符型数组作为函数参数:语法与二维整型数组类似

形参:
     1. 写一个二维数组的形式 (行数可以省略,列数不能省略)
     2. 需要传递行数 

实参:
     1.传数组名 
     2.传二维数组行数 

总结:

1.函数的思想 
2.函数语法
  函数定义 //输入数据--处理--输出 
  函数调用
  函数声明 
3.注意 
  a. 函数传参 --- 传递过程 --- 值传递 
  b. 函数与数组 
     数组作为函数参数 
     
     一维整型数组   形参 (数组形式,长度) 实参(数组名,数组长度)
     一维字符数组   形参 (数组形式) 实参(数组名)
     二维整型和二维字符型 
                    形参 (数组形式,行数) 实参(数组名,行数)

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

标识符 :

   名字 
   int a; //
   int maxOfArray(int a[],int len); // 函数名

作用域:

    标识符作用的范围 ---起作用的范围 

空间上:
   局部作用域
        在花括号范围内的,都是局部作用域    
   全局作用域
        不在任何一个花括号范围内 

可见性:
    就是程序运行到某句代码时,哪些表示符是可见(可以使用的)    

标识符的可见性的规则:
1.先定义,后使用 

2.同一作用域中,不能有同名标识符 //重复定义 (同一作用域:在同一个花括号内)

3.在不同的作用域,同名标识符,相互之间没有影响 

4.如果是不同的作用域,
  但是作用域之间存在"嵌套关系",
  则,
  内层的作用域的同名标识符,
  会屏蔽外层的作用域的同名标识符。
(就近原则) 

也就是说,不同层次的变量可以重名,且此时内层花括号的变量会屏蔽掉外层的同名变量,相当于被覆盖了·

#include <stdio.h>

int a=1;

int main()
{
	printf("a=%d\n",a);
	int a=2;
	printf("a=%d\n",a);
	if(1)
	{
		int a=3;
		printf("a=%d\n",a);
	}
}

a会依次输出1,2,3

变量:

//空间角度 

全局变量
局部变量 
//时间角度  --- 关键字  ---生命周期 

auto
static 加在局部变量的定义前面
       此时,将局部变量变为了静态变量 
       存储的空间发生变化 ---放在了静态区(全局区)
       生命周期 变成 了整个程序的生命周期

c程序加载到内存中,会安排到5个区域(数据区+代码区)
栈                    数据区       //局部变量 自动申请 自动释放
堆                                      //手动申请,手动释放
字符串常量区 
全局区(静态区)                     //这块空间,代码编译好之后,就开始存在 
                                   //生命周期,从程序开始到程序结束
-----------------------------------
代码区                代码区 

标签:函数,形参,int,---,作用域,数组
From: https://blog.csdn.net/qq_54094530/article/details/139183209

相关文章

  • 【c语言】一篇文章搞懂函数递归
    ......
  • 函数高级玩法
    分享几个比较重要的知识点,web框架中大量的运用了,所以我给摘出来啦!函数的嵌套闭包装饰器1.函数嵌套python中以函数为作用域,在作用域中定义的相关数据只能被当前作用域或子域使用name="隔壁老王"print(name)deffunc():print(name)func()1.函数在作用域中......
  • 状态价值函数、策略价值函数和动作价值函数
    策略价值函数求解策略价值函数Vπ(s)V^\pi(......
  • 拷贝构造函数
    简介是一个特殊的构造函数,只有一个形参,该形参常用const修饰,是对该类型的引用。当定义一个新的对象并用一个同类型的对象对它进行初始化时,用显式拷贝构造函数。当该类型的对象传递给函数或从函数返回类型的对象时,用隐式拷贝构造函数。拷贝构造函数拷贝构造函数通常用于:1、通......
  • 【C语言】字符函数和字符串函数
    在C语言中,字符函数和字符串函数通常用于处理单个字符和字符串。这些函数定义在<ctype.h>(字符函数)和<string.h>(字符串函数)头文件中。以下是一些常用的字符函数和字符串函数及其用法:字符函数(ctype.h)字符函数主要用于测试字符的属性或转换字符。isalnum():检查字符是......
  • 窗口函数 | rows between …… and ……
    ROWSBETWEEN...AND... 是SQL窗口函数中的一个子句,用于定义窗口函数操作的行范围。窗口函数允许用户对一组相关的记录执行计算,这些记录被称为窗口。基本语法<窗口函数>OVER([PARTITIONBY<列名>]ORDERBY<列名>[ASC|DESC][ROWSBETWEEN......
  • js函数柯里化
    JavaScript函数柯里化详解 更新时间:2022年01月14日15:33:47 作者:天界程序员  这篇文章主要为大家介绍了JavaScript函数柯里化,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助 −目录一、简单了解apply和call二、什么是函数柯里化?三、写......
  • lua打印调用的函数文件及行数
    lua根据调用堆栈可以打印调谁调用了我 string.split=function(s,delim)localsplit={}localpattern="[^"..delim.."]+"string.gsub(s,pattern,function(v)table.insert(split,v)end)returnsplitendfunctiongetWhoCallsMe()......
  • C++-函数
    函数(Function):是一个提前封装好的、可重复使用的、完成特定功能的独立代码单元。特点:提前封装、可重复使用的、完成特定功能将针对特定功能的、有重复使用需求的代码,提前封装到函数内,在需要的时候随时调用。基础函数语法return语句执行后,函数立刻结束函数不可定义在mai......
  • 在Go语言中如何实现变参函数和函数选项模式
    在Go语言编程中,我们经常会遇到需要给函数传递可选参数的情况。传统的做法是定义一个结构体,将所有可选参数作为结构体字段,然后在调用函数时创建该结构体的实例并传递。这种方式虽然可行,但是当可选参数较多时,创建结构体实例的代码就会变得冗长และ不太直观。Go语言的......