-
2020-08-24 22:21:35
来源:算法竞赛经典第二版P122
函数**(包括main函数)的形参和在该函数里定 义的变量都被称为该函数的局部变量**(local variable)。不同函数的局部变量相互独 立,即 无法访问其他函数的局部变量。需要注意的是,局部变量的存储空间是临时分配的,函数执 行完毕时,局部变量的空间将被释放,其中的值无法保留到下次使用。与此对应的是全局变 量(global variable):此变量在函数外声明,可以在任何时候,由任何函数访问。需要注意 的是,应该谨慎使用全局变量。(**注意:**若定义一个数组,若是全局变量,则可以不用初始化;若是定义局部变量,一定要初始化为0,否则后面用到会报错)
调用栈描述的是函数之间的调用关系。它由多个栈帧(Stack Frame)组成,每个栈帧对 应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量,因而不仅能在执行 完毕后找到正确的返回地址,还很自然地保证了不同函数间的局部变量互不相干——因为不 同函数对应着不同的栈帧。
C语言的变量都是放在内存中的,而内存中的每个字节都有一个称为地址 (address)的编号。每个变量都占有一定数目的字节(可用sizeof运算符获得),其中第一 个字节的地址称为变量的地址。
指针:
用int* a声明的变量a是指向int型变量的指针。赋值a = &b的含义是把变量 b的地址存放在指针a中,表达式*a代表a指向的变量。
** *a是指“a指向的变量”,而不仅是“a指向的变量所拥有的值”。**理解这一点相当重 要。例如,a = a + 1就是让a指向的变量自增1。甚至可以把它写成(a)++。注意不要写 成a++,因为“++”运算符的优先级高于“取内容”运算符“”,实际上会被解释成(a++)。指针也是一个 变量,只不过类型是“指针”
更多相关内容 -
c++作用域运算符用法(全局变量和局部变量)
2020-12-31 09:52:26通常情况下,如果有两个同名变量,一个是全局变量,另一个是局部变量,那么局部变量在其作用域内具有较高的优先权,它将屏蔽全局变量。作用域运算符 代码如下:#include<iostream>using namespace std;int num=10;int... -
全局变量与局部变量在内存中的区别详细解析
2021-01-01 10:12:063、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。 – 程序结束后由系统... -
局部变量 全局变量 堆栈总结
2018-06-20 11:28:08堆栈(stack)是内存中的一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出 -
c语言中的全局变量、局部变量、静态全局变量、静态局部变量简单区别和指针的*使用区别
2020-04-23 15:37:59断断续续地写代码是很痛苦的事情,得不偿失,失不再来,重头在学,循环往复,日渐消瘦,头...c语言中的全局变量、局部变量、静态全局变量、静态局部变量: 如果局部变量名和全局变量名一样时,忽略全局变量的值。 ... -
C语言学习笔记03:C语言_字符串_局部变量_全局变量_指针
2021-08-12 18:18:33课堂笔记2.1 字符串语法2.2 字符串操作2.3 函数注意点2.4 void 用法2.5 局部变量全局变量2.6 函数声明2.7 return 关键字的作用C语言第八课程笔记1. 内容安排2. 课堂笔记2.1 函数设计基本原则2.2 指针变量和普通变量...文章目录
C语言第七课程笔记
每一天的笔记包含如下内容:
- 当天授课内容安排
- 课堂重点内容笔记
- 课后思考题
1. 内容安排
第一节课:
字符串理解和语法语法(字符串理解、字符串定义语法、字符串输入和输出、字符串使用注意)
第二节课:字符串操作函数(字符串长度、字符串拷贝、字符串追加)
第三节课:字符串操作函数(字符串比较、格式化字符串、字符串转数字)、登陆验证案例
第四节课:字符串操作训练(计算字符串长度、字符串拷贝、字符串比较)
第五节课:函数理解和语法(函数作用、函数语法)、函数声明作用
第六节课:局部变量和全局变量、函数定义中的注意点
2. 课堂笔记
课堂主要内容、重要内容。
2.1 字符串语法
- 字符串以\0结尾的字符数组,用于保存文本类型数据.
- 双引号括起来的字符串会自动在最尾部增加 \0 字符.
- 字符串定义格式
char s[] = "hello world"
. - 字符串使用 %s 作为字符串输出站位符.
- Scanf 接收字符串输入时,默认碰到空格或者制表符、换行会停止读取输入内容.
- get_s 函数会读取键盘数据,直到达到指定长度字符数量、或碰到换行符.
2.2 字符串操作
1. 字符串拷贝: 1. strcpy, 将一个字符串全部拷贝到另外一个字符串中 2. strncpy,将一个字符串中指定长度拷贝到另外一个字符串中 2. 字符串长度: 1. strlen,计算字符串长度,不包含 \0 2. sizeof,计算字符串长度,包含 \0 3. 字符串拼接: 1. strcat,将一个字符串拼接到另外一个字符串尾部 2. strncat,将一个字符串指定长度拼接到另外一个字符串尾部
2.3 函数注意点
返回值:
1. C语言只允许函数返回一个结果 2. 函数没有返回值必须写 void 3. 函数的返回值可以忽略 4. 函数返回值定义的类型,一定要和函数实际返回的结果类型匹配,或者相互转换.
参数
1. 函数参数的个数可以有任意个. 2. 如果函数没有参数,必须要写 void 3. 函数的参数叫做形参,函数调用的时候分配内存,函数执行结束,参数的内存被释放。
函数体
1. 函数体可以为空 2. 函数定义不允许嵌套定义,只能在全局范围定义
函数名
1. 符合标识符的命名规则即可. 2. C语言中用小写+下划线.
2.4 void 用法
// void 用法
// 1. void 表示函数没有返回值
// 2. void 表示函数没有参数
// 3. void 表示忽略函数的返回值
// 4. void 表示忽略某个未使用的变量
2.5 局部变量全局变量
- 局部变量在函数内部定义, 函数的形参、内部定义临时变量。
- 局部变量只能在函数内部访问
- 从内存角度, 函数调用的时候才会分配内存,函数执行结束,局部变量内存回收.
- 全局变量在函数外部定义
- 全局变量可以在项目中任何文件、任何位置访问
- 从内存角度,全局变量在 main 函数执行之前创建,在程序结束之后释放内存。
- 如果全局变量和局部变量同名,默认在函数内部访问的是局部变量(就近原则)
2.6 函数声明
- 编译器看到函数调用,必须会做的工作, 函数调用检查:
- 函数的返回值检查
- 函数的参数检查
- 为了让编译器能够进行必要的函数调用检查,编译器必须要先看到函数声明或者函数定义.
- 函数声明语法:
- 把函数体的花括号去掉
- 函数声明中,形参名字可有可无
2.7 return 关键字的作用
// 1. 当函数执行到 return 语句的时候,函数马上终止执行,后续代码不再执行.
// 2. return 后面可以跟值、也可以不跟值(返回值类型是void).
// 3. return 后面既可以写变量、也可以写常量
// 4. return 返回值的类型一定要和函数的返回值类型匹配, 或者能够转换为返回值类型
C语言第八课程笔记
每一天的笔记包含如下内容:
- 当天授课内容安排
- 课堂重点内容笔记
- 课后思考题
1. 内容安排
第一节课:
函数设计原则、函数分文件编写
第二节课:函数强化训练(计算数组中的偶数和、实现数组逆序、实现字符串转换为小写)
第三节课:函数强化训练(输入半径计算面积、返回指定范围累加和、实现数组排序)
第四节课:指针语法(指针变量定义、指针大小、指针初始化、指针解引用)、指针变量和普通变量区别
第五节课:指针操作(指针类型、解引用、指针运算)、无类型指针、野指针
第六节课:const和指针、指针和数组名
2. 课堂笔记
课堂主要内容、重要内容。
2.1 函数设计基本原则
.h 头文件中编写函数声明,不能编写函数定义.
.c 文件中编写函数定义.
基本原则:
-
函数的规模要小,尽量控制在50行代码以内.
-
函数的功能要单一,不要让它身兼数职. 单一职责原则
-
在函数入口处对参数进行合法校验.
int my_divide(int a, int b) { if(0 == b) { return -1; } int ret = a / b; return ret; }
-
当函数中返回结果时,确保所有控制分支都有返回值.
int my_func() { if() { return 0; }else if() { return 0; }else { return 0; } }
2.2 指针变量和普通变量区别
- 普通变量需要占用一定大小的内存空间,指针变量也需要占用一定大小的内容空间.
- 普通变量需要先定义再使用,指针变量也需要先定义再使用
- 普通变量内存中保存的是数据,指针变量保存的地址.
- 普通变量可以进行加减乘除、赋值等运算,指针只能进行加减、赋值运算.
使用指针原则:
- 明确指针指向哪里.
- 明确指针指向内存单元的数据类型是什么?内容是什么?
2.3 指针变量理解
-
从内存角度,指针变量、普通变量没有啥区别,都是一块内存,并且这块内存都有地址。
唯一的区别:普通变量存储数据,指针变量存储地址 -
普通变量有普通变量运算规则,指针变量有指针变量的运算规则。取值、赋值、加减运算
-
从语法角度, 指针变量多了个标识
*
,以此表示这个变量中存储的是地址。 -
指针无论什么类型、无论几级指针统统都是4个字节(32位) 8字节(64位)
-
在相同平台上,无论什么类型的指针占用内存大小都是一样的
-
对指针变量取地址,才能拿到指针变量本身所占用的空间地址。如果直接使用指针变量,那么代表的是指针指向空间的地址。
2.4 修改一个变量的值
修改一个变量的值,有两种:
1. 通过变量名直接修改(前提你得能拿到变量名)
2. 通过指针间接修改(不需要拿到变量名,只需要变量地址即可)
在函数内部定义的变量只能在函数内部访问,如果想在其他函数中修改另外一个函数内的变量。只要该函数拿到这个变量的地址即可。
2.5 指针类型
-
指针类型不同,那么指针的步长就不同
char * 类型指针,步长是1个字节
int * 类型指针,步长是4个字节
double * 类型指针,步长是8个字节
-
当解引用的时候,指针类型决定了编译器从首地址开始取多少字节。
-
无类型指针, 没有步长、不能解引用。 无类型指针占用4字节或8字节。
-
任何类型转换为无类型指针的时候,不需要强制转换
2.6 指针和数组
- 数组名就是指向首元素的类型指针,数组名不能修改指向。
- 当数组名作为函数参数的时候,会被编译器转换为指针。
- 基础数据类型传参的时候,值传递。数组在传参的时候,是地址传递。
C语言第九天课程笔记
每一天的笔记包含如下内容:
- 当天授课内容安排
- 课堂重点内容笔记
- 课后思考题
1. 内容安排
第一节课:
回顾指针理解、指针和字符串
第二节课:指针数组(整型指针数组、字符串指针数组)、const和指针
第三节课:指针做函数参数、指针做函数返回值
第四节课:多级指针(多级指针理解)
第五节课:实现返回数组最值和平均值、指针实现数组冒泡排序
第六节课:指针实现字符串拷贝、指针实现字符串拼接、指针实现字符统计
2. 课堂笔记
课堂主要内容、重要内容。
💗💗💗
print("如果文章对你有用,请点个赞呗O(∩_∩)O~")
System.out.println("如果文章对你有用,请点个赞呗O(∩_∩)O~");
cout<<"如果文章对你有用,请点个赞呗O(∩_∩)O~"<<endl;
💗💗💗
-
局部变量、全局变量、静态变量
2019-09-16 09:52:33局部变量 定义:局部变量指在程序中只在特定过程或函数中可以访问的变量。换言之,在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些...局部变量
定义:局部变量指在程序中只在特定过程或函数中可以访问的变量。换言之,在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些变量的,它们称为局部变量。
全局变量
定义:在函数外定义的变量是外部变量,外部变量就是全局变量,全局变量可以为本文件中其它函数所共用,它的有效范围从定义变量的位置开始到本源文件结束。
局部变量与全局变量的区别
局部变量可以与全局变量重名,但是局部变量会屏蔽全局变量。在函数体内引用变量会用到同名的局部变量而不是全局变量,对于一些编译器来说,
在同一个函数体内可以定义多个同名的局部变量
。例如我们可以在一个函数内部,在两个循环中都定义同名的局部变量i,而局部变量i的作用域在那个循环体内。
1.作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等;2.内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区;
3.生命期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了;
4.使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量
特别注意:局部变量不能赋值为与全局变量同名的值
静态变量:
定义:在程序运行期间分配固定的存储空间的变量,叫做静态变量 。
关键字:static
特别说明:静态变量自然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由static
加以定义后才能成为静态外部变量,或称静态全局变量;对于自动变量,它属于动态存储方式, 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。特点:
(1)静态局部变量在
函数内定义
,但不像自动变量那样,当调用时就存在,退出函数时就消失
。静态局部变量始终存在
着,也就是说它的生存期为整个源程序。(2)静态局部变量的生存期虽然为整个源程序,但是其
作用域仍与自动变量相同
,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。(3)允许对构造类静态局部量赋初值。若
未赋以初值
,则由系统自动赋值。数值型变量自动赋初值0
,字符型变量赋空字符
。(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
三者区别:
一、从作用域看:
C++变量根据定义的位置的不同的生命周期,具有不同的作用域,可分为:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。
1.
全局变量具有全局作用域。
全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。2.
局部变量具有局部作用域,
它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。3.
静态局部变量具有局部作用域,它只被初始化一次,
自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。4.
静态全局变量也具有全局作用域
,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。二、从分配内存空间看:
1.全局变量,静态局部变量,静态全局变量都在
静态存储区
分配空间,而局部变量在栈
里分配空间2.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,**当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。**而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
Tips:
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
-
C++局部变量与全局变量 | 输出局部全局变量
2020-11-30 16:59:48C++局部变量 C++局部变量是指:在一个函数内部定义的变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它,在此函数以外是不能使用这些变量的。 同样,在复合语句中定义的变量只在本复合语句范围内有效... -
C语言笔记-全局变量及指针理解
2021-10-27 10:52:01C语言笔记-全局变量及指针理解 以下程序 #include <stdio.h> void _swap(int a, int b) ...运行结果仍为a=5,b=10,原因为两个函数的a,b都是局部变量,占用地址空间也不同。 修改方法 1.用全局变量定义 #inclu -
全局变量和局部变量的区别
2018-08-23 21:46:04静态全局变量:使用 static 关键字修饰,也具有全局作用功能,和全局变量区别在于如果该程序包含多个文件,其作用范围仅在定义的那个文件,不能作用于其它文件,这样即使两个不同的源文件都定义了相同名字的静态... -
全局变量、局部变量、静态全局变量、静态局部变量的区别(与常见面试基础题)
2019-10-04 18:23:00对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量... -
C语言通过函数修改局部变量传递指针参数
2019-02-18 15:47:41倘若需要在主函数中写一个初始化函数InitStruct专门对其进行初始化赋值,又不想把这个变量声明成全局变量或者成员变量,比较好的方法是将地址指针作为参数传给初始化函数,具体方法: 1.在主函数中声明变量:struct... -
局部变量和全局变量的区别
2017-03-05 18:17:451、全局变量 全局变量也成为外部变量,它是在函数外部...在C等面向过程语言中,局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。 # -
关于指针全局变量和局部变量存储位置的问题
2019-10-01 20:42:10想问一下,修改下面代码中的全局变量后,在打印pstr变量时,为什么在反汇编代码中看到callq 5e0 (栈检查失败),这是pstr的地址指向出现了问题吗,求大佬详细地解答 ``` #include #include #include ... -
全局变量和局部变量的默认初值问题
2020-07-23 23:53:58定义局部变量时,默认初始是随机的,因为局部变量的定义是在栈区,这个是程序运行起来后,动态分配的,那么这儿内存的内容可能是上一个变量的值等等都有可能 上述为理论分析,我也实际测试了,确实如此 ... -
关于局部变量和全局变量运行快慢
2020-04-06 19:09:16迭代方法,我定义全局变量和局部变量next指针的运行时间是不同的。 全局变量是24ms,局部变量是花了8ms。 一开始我想的是局部变量的话,创建销毁的代价不想承担(调用构造函数和析构函数),但是实际而言,这点代价... -
C++局部变量指针保持在List,Vector中使用的问题
2014-09-25 21:17:561.SetValue这个函数,是将局部的开辟的Node变量存储在链表或者list中,然后通过析构函数去释放,一般情况下,局部变量不能作为返回值,局部变量离开了函数范围,就会释放,为什么这里可以完好的保存。 2.... -
C语言中全局变量、局部变量、静态全局变量、静态局部变量
2019-04-08 19:55:16静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。... -
把局部变量变成全局变量的方法
2018-09-10 09:59:44//如果想把局部变量变成全局变量,只需把局部变量赋给 window (function (win) { var lut = 520;//局部变量 win.lut = lut; })(window); // 外部可以访问这个局部变量了 console.log(lut); ... -
c++(和opencv)如何把局部变量变成全局变量的功能
2019-08-19 16:45:40今天在开发opencv项目的时候,需求是:视频实时播放,鼠标点击某处,新窗口放大播放局部视频。 这里遇到的问题是:需要用opencv获取鼠标。 背景:opencv有自带的鼠标回调函数,而且它的on_Mouse()函数是封装好的,有... -
C++中局部变量可否与全局变量重名
2019-01-19 14:11:31此问题研究的是变量的作用域的问题。一个声明将一个名字引进一个作用域;局部变量(通常在函数中定义)的作用域是...与全局变量重名的局部变量可以屏蔽全局变量,如果想在块内使用全局变量需要通过作用域解析运算符... -
C语言全局变量和局部变量总结
2018-08-28 15:01:10②形参变量、在函数体内定义的变量都是局部变量,实参给形参传值的过程也就是给局部变量赋值的过程。 ③可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互补干扰,也不会发生混乱。 ... -
C++中局部变量和全局变量的存储位置和内存回收机制
2019-08-07 15:29:10不要使用局部变量的指针和引用! 在函数结束后,局部变量被释放后,指针和引用可能在短时间内可以使用,也可能会立即失效。因为在指针和引用所指向和代表的 内存一旦被重新分配就会导致该指针和引用会立即失去原本... -
函数返回局部变量的指针或引用
2018-05-16 23:17:53一般来说,由于在离开函数后局部变量会被释放,所以是不允许函数返回指向局部变量的指针或引用的。我们往往需要遵循如下原则:引用作为返回值,必须遵守以下规则:(1)不能返回局部变量的引用。主要原因是局部变量... -
C++函数返回局部变量指针的问题
2015-11-08 16:48:34讲这个问题之前要先简单讲一下C++的内存管理。...1)堆(heap):new的都存放在这里,属于动态分配,如果在程序中调用delete释放掉,那么将一直存在,直到程序结束,由程序释放掉。 2)栈(stack):由系统 -
C语言-全局变量与局部变量
2022-04-25 20:55:28C语言-全局变量与局部变量 某些问题要想彻底解决,只能仰仗技术革新和顶层设计的突破。就好比汽车出现前,你无论如何改进饲料配方和养殖技术,也无法培养出一匹时速100公里的马。正因为在认识问题这个阶段总是... -
C: 指针返回值,静态局部变量
2018-11-18 23:10:29当使用定义函数返回指针变量时,我们要注意当返回的指针指的是局部变量的时候,这个指针指向是危险变量,因为局部变量在使用完后会被内存清空,因此这个指针指向的不定的。 如果要使局部变量的值在函数调用后不消失... -
【malloc 申请的变量、与局部变量、全局变量的区别】
2018-04-17 17:25:32无论全局变量还是局部变量都是系统自动分配管理的,内存分配在:静态储存区和动态储存区即栈; 2. 全局变量:如果不人为初始化,系统自动初始化为0; 3. 静态局部变量:编译时自动赋初始值(数值型初始化为0,... -
C语言—指向函数的指针、全局变量和局部变量 、结构体、枚举
2015-04-04 14:00:07------Java培训、Android培训、iOS培训、.Net培训、...(*p)是固定写法,代表指针变量p将来肯定是指向函数 // 左边的void:指针变量p指向的函数没有返回值 // 右边的():指针变量p指向的函数没有形参 int sum(int