IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言值传递与地址传递 -> 正文阅读

[C++知识库]C语言值传递与地址传递

一、C语言函数的值传递

C语言的值传递,顾名思义就是使用常量、数组等作为函数的参数,定义一个函数后,其在被主函数调用的过程中,实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元。

值传递的特点:

值传递的最大的特点就是单向传递,即主调函数被调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。
如下代码所示,定义了一个函数swap()用于交换两个参数的值,在被主函数调用的过程中,a和b的值相当于被拷贝了一份过去swap函数,无论在swap()函数中完成了什么操作,都是不会影响到主函数中定义的两个变量a、b存储的值的。

#incldue <stdio.h>
void swap(int x,int y)
{
	int temp;
	temp = x;
	x = y;
	y = temp;
}
int main(int argc, char *argv[])
{
	int a = 12,b = 24;
    swap(a,b); // 值传递
    printf("a = %d b = %d",a,b);
	return 0;
}

程序运行后的结果如下:

C:\Users\11197\Desktop\main>swap
a = 12 b = 24

二、C语言函数的地址传递

大家呢都知道,在C语言中,数组名就代表着数组存储空间的首地址,所谓的地址传递,就是函数的参数是数组名或者指针,传递的是数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,即形参和实参是相同的。

地址传递的特点:

形参并不存在存储空间,编译系统不为形参数组分配内存。因此在数组名或指针作函数参数时所进行的传送只是地址传送,形参在取得该地址之后,与实参共同拥有一段内存空间,形参的变化也就是实参的变化。

实例代码如下,函数swap()传入的是两个地址,在主函数调用的过程中,将变量a、b的地址传入了swap()函数中,在swap()函数中,通过指针解引用等操作完成了两个地址的存储值的值交换。

#include <stdio.h>
void swap(int* x,int* y)
{
	int temp;
	temp = *x;
	*x = *y;
	*y = temp;
}
int main(int argc, char *argv[])
{
	int a = 12,b = 24;
	swap(&a,&b); //地址传递
	printf("a = %d b = %d\n",a,b);
	return 0;
}

函数运行结果如下:

C:\Users\11197\Desktop\main>dizhi
a = 24 b = 12

可以看到,通过地址传递的方式,成功的交换了变量a、b中存储的值。

三、局部变量作为函数返回值

局部变量是不会进行存储的?所以函数void *fun(void)调用结束的时候,buf[]被释放了,没法返回一个地址。

#include <stdio.h>

char *fun(void)
{
	 char buf[] = "helo world!";
	return buf;

}

int main()
{
	char *p;
	
	p=fun();
	printf("the p is %s\n",p);
	return 0;
}

可以看到程序运行的结果如下:

C:\Users\11197\Desktop\main>jububianliang
the p is Pi

接下来在函数中的bud前面加上static看看效果,加上这个值相当于将buf[]存储在不易被改变的静态区

#include <stdio.h>

char *fun(void)
{
	static char buf[] = "helo world!";//这里有没有static会影响输出结果,加上static相当于数据存储在数据区
	
	return buf;

}

int main()
{
	char *p;
	
	p=fun();
	printf("the p is %s\n",p);
	return 0;
}

我们来看运行输出的效果:

C:\Users\11197\Desktop\main>jububianliang
the p is helo world!

将函数void *fun(void)改变为只单单返回一个“hello world!”也可以看到相同的效果:

#include <stdio.h>

char *fun(void)
{
	return "hello world!";
}

int main()
{
	char *p;
	
	p=fun();
	printf("the p is %s\n",p);
	return 0;
}

运行效果如下:

C:\Users\11197\Desktop\main>jububianliang
the p is helo world!
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:05:17  更:2021-07-16 11:06:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/30 23:21:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码