首页 > 编程语言 >C++笔记--函数、预处理

C++笔记--函数、预处理

时间:2023-03-09 17:22:43浏览次数:35  
标签:arr 函数 -- 局部变量 C++ int 参数 预处理 定义

1 函数

1.1函数的介绍

1.1.1 函数的概述

函数是c语言的功能单位。实现一个功能可以封装一个函数来实现。

定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值需要传哪些数据给函数?(实参)、函数的功能代码(函数体)如何实现?函数需要返回什么类型的数据?考虑(传入参数、函数体、返回值类型)

1.1.2 函数的分类 (定义角度)

库函数((c++语言库)、自定义函数、系统调用(内核提供给用户的函数接口)

1.1.3 函数的分类 (有无参数)

无参的函数:不能将函数外部的数据传递给函数内部

有参的函数:通过参数将函数外部的数据传递到函数内部

(参数:函数外部数据到函数内部的桥梁)

1.2 函数的定义、声明、调用

1.2.1 函数的定义

 

 

实现函数体,确定函数名,函数的形参、函数的返回值类型

1.2.2 函数声明

函数声明:告知编译器 该函数的函数名是啥 有几个形参 返回值类型是啥

1.2.3 函数的调用

执行函数体,一般调用格式:函数名(实参);

 

 

 

1.4 函数的传参

1.4.1 普通变量作为函数的参数

函数内部 需要使用外部变量的值 需要将外部变量的值传递给函数内部。这时普通变量就要作为函数的形参(单向传递之值传递)

1.4.2 数组作为函数的参数

1 数值数组作为函数的参数 函数内部可以(读写)外部数据的元素。

using namespace std;
void inputIntArray(int arr[],int n); void sortIntArray(int arr[],int n); void printIntArray( int arr[],int n); void main() { int arr[5] = {0}; int n = sizeof(arr)/sizeof(arr[0]); //获取键盘输入 inputIntArray(arr,n); //对数组排序 sortIntArray(arr,n); //对数组遍历 printIntArray(arr,n); } void printIntArray(int arr[], int n) { int i=0; for(i=0;i<n;i++) { cout<<arr[i]<<" "; } cout<<endl; } void inputIntArray(int arr[], int n) { cout<<"请输入"<<n<<"个int型数据:"; int i = 0; for(i=0;i<n;i++) { cin>>arr[i]; } return; } void sortIntArray(int arr[],int n) { int i =0; for(i=0;i<n-1;i++) { int j=0; for(j=0;j<n-i-1;j++) { if(arr[j]>arr[j+1]) { int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } }

2 字符数组作为函数的参数

int myStrlen(char str[]);
void myGetString(char str[],int n);
void main()
{
    char str[128] = "0";

    //键盘获取字符串
    myGetString(str,sizeof(str));

    //获取字符串的长度
    cout<<"长度:"<<myStrlen(str)<<endl;
}
int myStrlen(char str[])
{
    int i=0;
    while(str[i] !='\0')
        i++;
    return i;
}
void myGetString(char str[],int n)
{
    cout<<"请输入一个字符串:";
    cin.getline(str,n);
}
 

2 预处理

2.1 内存分区

进程:可执行文件从运行到结束整个动态的过程就叫进程。(占内存空间)

在32位平台每一个进程占4G空间(虚拟空间)

 

 

 

2.2变量的存储

2.2.1 普通局部变量

定义形式:{}里面定义的普通变量叫普通局部变量

 

 

 存储区域:栈区

1、普通局部变量不初始化内容不确定

2、普通局部变量同名就近原则(尽量别同名)

2.2.2 普通全局变量

定义形式:在函数外定义的普通变量

 

 

 作用范围:当前源文件以及其他源文件都有效。

  生命周期:整个进程。

  存储区域:全局区

1、全局变量不初始化内容为0

2、全局变量和局部变量同名优先选择局部变量。

3、其他源文件使用全局变量必须对全局变量进行extern声明。

2.2.3  静态局部变量

定义形式:在{}加static定义的局部变量就叫静态局部变量

 

 

 作用范围:所在的复合语句之间有效

 生命周期:整个进程有效

存储区域:全局区(全局区存储特点:整个进程有效,内容不初始化为0)

静态局部变量整个进程都存在(第一次定义有效)

2.2.4  静态全局变量

定义形式:在函数外加static修饰定义的变量就是静态全局变量

2.3 全局函数和静态函数

 

 

 作用范围:只能在当前源文件使用

存储区域:全局区

2.3.1 全局函数(函数默认都为全局函数)

全局函数:在当前源文件以及其他源文件都可以使用,

如果其他源文件使用需要extern对全局函数进行声明

2.3.2 静态函数(加static修饰的函数)

 

 

 

2.4 头文件包含

头文件包含:在预处理结果将头文件的内容原封不动的包含在目的文件中

#include <head.h>  建议<>包含系统头文件

<> 从系统指定目录寻找head.h头文件

#include "head.h"  建议""包含自定义头文件

""先从当前目录寻找head.h头文件  如果找不到  再到系统指定的目录下寻找

2.5 #define 宏

编译四阶段:预处理、编译、汇编、链接

使用关键字 define定义 叫宏 宏尽量大写和普通变量区分开

#define PI 3.14 (宏定义)

在预处理结果 使用3.14替换所有出现PI的位置(宏展开)

2.5.1 不带参数的宏

 

 

 宏的作用范围:是从定义处开始 到当前文件结束都有效

#undef可以结束宏的作用域

宏 没有作用域的限制,只在当前源文件 有效

2.5.2 带参数的宏(宏函数)

 

 

 1、宏的参数不能有类型

 

 

 2、 宏不能保证参数的完整性

可以使用()的形式 让带参数的宏 具备一定的完整性

 3、 宏不能作为结构体、类的成员

4、案例:从外部展开

 

 2.5.3 宏函数和普通函数的区别:

带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压栈弹栈。所以带参宏,是浪费了空间,因为被展开多次,节省时间;

带参函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的时候要,压栈弹栈。有个调用的过程。带参函数是浪费了时间,节省了空间;

带参函数的形参是有类型的,带参宏的形参没有类型名。

函数有作用域的限制,可以作为类的成员;宏函数没有作用域的限制,不能作为类的成员

 

标签:arr,函数,--,局部变量,C++,int,参数,预处理,定义
From: https://www.cnblogs.com/krimes827828/p/17199237.html

相关文章

  • 串口登录提示"Login incorrect"
    为了安全起见,需要给串口设置登录限制,即需要正确输入用户名和密码以后才能正常使用串口命令行。这里实现的方法是在/etc/inittab里面加入以下内容:ttyS3::respawn:/sbin/g......
  • kibana 展示日志信息携带k8s pod宿主机ip
    1、filbeat容器引入宿主机IP变量。2、配置文件引入环境变量。 pod引入pod信息的相关变量env:-name:MY_NODE_NAMEvalueFrom:fieldRef:fieldPa......
  • 打造让别人眼前一亮的Portfolio(从0到1) - 使用React和Three JS
        【打造让别人眼前一亮的Portfolio(从0到1)-使用React和ThreeJS】https://www.bilibili.com/video/BV1D54y1u7a7?vd_source=9dbcff019fe7cd087d0ea14c75f1546......
  • iOS16之后的媒体全屏播放似乎需要App支持横屏模式才行
    解决plus.screen.lockOrientation('portrait-primary');//强制App竖屏,不可旋转横屏"screenOrientation":[//应用支持的横竖屏 "portrait-primary",//支持竖......
  • 无重复字符最长子串
    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度......
  • 微服务之间的数据依赖问题
      数据冗余的方案    解耦业务逻辑的数据同步方案 ......
  • 混频器的原理
    前言,在双路语音同传的无线收发系统中需要用到混频器,它到底有什么用又该如何制作混频器的作用在发射端,混频器主要起升频作用,通过本地振荡器将调制信号提高的指......
  • 最终挂掉的代码
    [NOIP2005提高组]过河题目描述在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳......
  • Java:包装类的缓存机制是?
    对包装类进行直接赋值时,若值在缓存区内,则会指向执行缓存区的地址。(通过new赋值则不会)缓存范围:1、Boolean,全部缓存。2、Character、Byte、Short、Intege......
  • 向量的计算(减法)
    减法:等于各分量相减公式:[x1,y1,z1]-[x2,y2,z2]=[x1-x2,y1-y2,z1-z2]几何意义:向量a,向量b相减,理解为以b的终点为始点,以a的终点为终点的向量,方向由b指向a(指向被减数)在Un......