c语言函数的调用和声明
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言函数的调用和声明相关的知识,希望对你有一定的参考价值。
有一段主函数 还有很多其他小的函数如何理解在不同的函数中可以定义同一个变量 还能传递值 我真滴好晕球球大神帮忙解答(´;︵;`)
假设主函数main()。其他函数void fun(int a,int *b)。
关于函数定义和声明:
在代码中fun函数,有完整函数体的代码就是函数定义部分,比如void fun(int a,int *b)。。。;。
如果没有具体实现的函数体代码(也就是大括号内容),那么就是函数声明。比如void fun(int ,int *);
关于函数声明和调用:
如果fun函数定义在main代码上面。比如:
void fun(int a,int *b)。。。;
int main()
int a=0,int b=0;
......
fun(a,&b);//这里fun定义代码在main上面,所以可以不需要声明。反之需要先写声明语句
return 0;
关于函数局部变量及全局变量:
简单区分:
定义在函数之外的就是全局变量,这个变量所有函数都可以直接使用,并且共用同一个地址。任意函数修改了变量值,其他函数调用也会变。
定义在函数之内的就是局部变量,局部变量只属于该函数,其他函数即使定义了同样名字的变量,这两个变量也不同地址,互不相干。
比如:
int a;//这就是全局变量,作用域下所有函数共用
int main()
int b;//这就是局部变量,只在本函数有效,如果想在调用fun函数时让fun也使用该变量,需要把这个变量的地址作为参数传递过去。
printf("%d",b);
return 0;
注意:c语言中允许局部变量和全局变量同名,但是同名的局部变量会屏蔽全局变量,实际代码避免同名。
关于函数传值和传址:
如函数void fun(int a,int *b)..........;这里形参a 和*b,分别表示一个值和一个地址
所以在调用该函数时,比如:
int main()
int c,d;
fun(c,&d);//这里调用就对应上面形参类型,第一个参数传递了c的值(传值),第二个参数传递了d的地址(传址),这里c和&d,叫做实参。当fun函数运行时改变了a和b指向地址的值,对应main函数中c的值不变,d的值改变。
return 0;
顺带一说:局部变量,在函数运行结束后会自动释放,所以想把局部变量地址作为返回值,需要用malloc函数申请。(这里看不懂可以暂时忽视)
参考技术A 在函数内定义的变量是局部的,只在函数内部有效,每一个函数定义的相同变量,只在定义的函数里面有效。
C语言 函数值传递和址传递
目录
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
一.简介
函数声明只是一个空壳,不会有具体的函数实现,而定义要实现函数的实现,例如:
1.函数声明:不需要实现这个函数的功能
int sub(int x,int y); //只需要声明即可,不需要实现这个函数的功能
2.函数定义:必须实现这个函数的功能
int sub(int x,int y) 需要实现这个函数的功能
{
return (x-y);
}
3.函数调用:调用之前必须先声明或者定义
函数在调用之前必须声明或者定义,否则会报错:找不到标识符,这也是为什么 hello world
中调用 printf
函数必须要包含 stdio.h
头文件的原因;
二.函数值传递
在 C
语言中,函数的参数传递方式有两种:值传递与地址传递。
值传递:使用变量、常量、数组元素作为函数参数,在调用结束后,形参值的任何变化都不会影响到实参的值。举个例子:
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 函数值传递和址传递
//@Time:2021/06/20 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
#include <stdio.h>
void func(int x, int y)
{
x = 100;
y = 200;
printf("func:x = %d, y = %d\\n", x, y);
}
int main(void)
{
int a=10;
int b=20;
/*变量a、b为func函数的实际参数*/
func(a, b);
printf("main:a = %d, b = %d\\n", a, b);
return 0;
}
/*
输出:
func:x = 100, y = 200
main:x = 10, y = 20
*/
main
函数中调用 func
函数,以整数类型 a
,b
作为实参传递,虽然在 func
函数中形参 x
,y
值发生改变,但是并以不会影响 main
函数中 a
,b
的值,这就是所谓的值传递;
三.函数址传递
在 C
语言中,函数的参数传递方式有两种:值传递与地址传递。
址传递:使用指针变量或者内存地址作为函数参数,在调用结束后,实参跟随形参一起变化。举个例子:
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 函数值传递和址传递
//@Time:2021/06/20 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
#include <stdio.h>
void func(int *x, int *y)
{
*x = 100;
*y = 200;
printf("func:x = %d, y = %d\\n", x, y);
}
int main(void)
{
int a=10;
int b=20;
/*分别对变量a、b取地址,并作为func函数的实际参数*/
func(&a, &b);
printf("main:a = %d, b = %d\\n", a, b);
return 0;
}
/*
输出:
func:x = 100, y = 200
main:x = 100, y = 200
main
函数中调用 func
函数,分别对变量 a
、b
取地址,并作为 func
函数的实参传递,由于形参 x
和实参 a
,形参x
和实参 a
指向同一个内存地址,在 func
函数中形参 x
,y
值发生改变,main
函数中 a
,b
的值也会跟着一起改变,这就是所谓的址传递;
四.函数值传递和址传递区别
- 值传递:实参是传递的值,并非地址,形参的值发生改变,实参不受影响;
- 址传递:实参是传递的地址,并非值,形参的值发生改变,实参会跟着一起改变(因为实参和形参都是指向同一块内存地址);
五.猜你喜欢
- C语言逻辑运算符
- C语言三目运算符
- C语言逗号表达式
- C语言 sizeof 和 strlen 函数区别
- C语言 strcpy 和 strcpy_s 函数区别
- C语言 memcpy 和 memcpy_s 区别
- C语言 数组定义和使用
- C语言 数组遍历
- C语言 数组下标越界
- C语言 数组内存溢出
- C语言 数组下标越界和内存溢出区别
- C语言 二维数组定义和使用
- C语言 二维数组行数和列数计算
- C语言 指针声明和定义
- C语言 指针 p++ / p–
- C语言 p++/§++/_(p++)/_p++
- C语言 使用指针遍历数组
- C语言 指针和数组区别
- C语言 数组指针
- C语言 指针数组
- C语言 指针数组和数组指针区别
- C语言 空指针 NULL
- C语言 void 指针
- C语言 野指针
- C语言 函数声明和定义
- C语言 函数声明和调用
- C语言 函数值传递和址传递
未经允许不得转载:猿说编程 » C语言 函数值传递和址传递
本文由博客 - 猿说编程 猿说编程 发布!
以上是关于c语言函数的调用和声明的主要内容,如果未能解决你的问题,请参考以下文章