函数形式参数传递地址和传递数值的区别(C语言)

本文探讨了C语言中形式参数传递的两种方式:数值传递导致数据副本交换,而地址传递则直接操作内存地址。通过实例对比,展示了如何正确使用指针进行地址操作以修改变量值。错误代码演示和修正也帮助读者理解常见误区。
摘要由CSDN通过智能技术生成


1、区别:

  • 传递地址直接访问内存空间地址,如果修改对应的地址空间的数值,再次访问时数值发生变化

2、

  • 变量的操作:
    1、对变量的操作
  • 指针变量的操作:
    2、只对对内存空间的操作
    3、对内存空间的存放的数据进行操作

一、形式参数传递变量的数值

code:demo1.c

#include<stdio.h>

void pointerChangData(int data1, int data2)
{
	int temp;
	temp	= data2;
	data2	= data1;
	data1	= temp;
}

int main(void)
{
	int data1=1, data2=99;
	
	printf("交换之前数据的值:%d, %d\n", data1, data2);
	pointerChangData(data1, data2);//传递的参数是数值
	printf("交换之后数据的值:%d, %d\n", data1, data2);
	
	return 0;
}

运行结果:结果不交换

交换之前数据的值:1, 99
交换之后数据的值:1, 99

二、 形式参数传递地址

code:demo2.c

#include<stdio.h>

void pointerChangData(int *pdata1, int *pdata2)
{
	int *temp;
	
	temp	= pdata2;
	pdata2	= pdata1;
	pdata1	= temp;
	printf("temp:%p\n", &temp);
	printf("pdata1:%p\tpdata2:%p\n", pdata1, pdata2);
}


int main(void)
{
	int data1=1, data2=99;
	
	printf("data1:%p	data2:%p\n", &data1, &data2);
	printf("交换之前数据的值:%d, %d\n", data1, data2);
	pointerChangData(&data1, &data2);
	printf("交换之后数据的值:%d, %d\n", data1, data2);
	
	return 0;
}

运行结果:交换内存地址空间,数值没有改动

data1:000000000061FE4C data2:000000000061FE48
交换之前数据的值:1, 99
temp:000000000061FE08
pdata1:000000000061FE48 pdata2:000000000061FE4C
交换之后数据的值:1, 99

code:demo3.c

#include<stdio.h>


void pointerChangData(int *pdata1, int *pdata2)
{
	int temp;
	
	temp	 = *pdata2;
	*pdata2	 = *pdata1;
	*pdata1	 =  temp;
	
	
	printf("pdata1:%p\tpdata2:%p\n", pdata1, pdata2);
}


int main(void)
{
	int data1=1, data2=99;
	
	printf("data1:%p	data2:%p\n", &data1, &data2);
	printf("交换之前数据的值:%d, %d\n", data1, data2);
	pointerChangData(&data1, &data2);
	printf("交换之后数据的值:%d, %d\n", data1, data2);
	
	return 0;
}

运行结果:直接反问内存地址空间,对里面的数值进行修改,再次访问数值发生改变。

data1:000000000061FE4C data2:000000000061FE48
交换之前数据的值:1, 99
pdata1:000000000061FE4C pdata2:000000000061FE48
交换之后数据的值:99, 1

错误的代码操作

在这里插入图片描述
在这里插入图片描述

再挣扎一下

#include<stdio.h>

int* pointerChangData(int *pdata1, int *pdata2)
{
	int a = 1000;
	int b = 9999;
	pdata1 = &a;
	pdata2 = &b; 
	//printf("交换之后数据的值:%d, %d\n", *pdata1, *pdata2);
	return pdata1;
}
void pointerChangData1(int *pdata1, int *pdata2)
{
	*pdata1 = 1000;
	*pdata2 = 9999;
}
void pointerChangData2(int *pdata1, int *pdata2)
{
	int *temp;
	
	temp	= pdata2;
	pdata2	= pdata1;
	pdata1	= temp;
	printf("temp:%p\n", &temp);
	
}
int main(void)
{
	int data1=1, data2=99;
	
	printf("data1:%p	data2:%p\n", &data1, &data2);
	printf("交换之前数据的值:%d, %d\n", data1, data2);
	//传递地址过去,如果想要改变地址的内存空间,需要对应返回return 地址回来;
	
	pointerChangData(&data1, &data2);
	/* 传递地址过去,地址相当于我家(原本是还没有装修的), 
	pointerChangData1,函数,让装修工对我家进行装修修改,样子是变了,
	位置地址还是那个,没变 
	*/
	printf("交换之后数据的值:%d, %d\n", data1, data2);
	printf("data1:%p\tdata2:%p\n", &data1, &data2); 
	return 0;
}

/*
int main(void)
{
	int *data;
	int *data0; 
	int data1=1, data2=99;
	
	printf("data1:%p	data2:%p\n", &data1, &data2);
	printf("交换之前数据的值:%d, %d\n", data1, data2);
	data = pointerChangData(&data1, &data2);
	//一个指针的地址无法给一个数据类型(int,char,float...) 
	data1 = *data;
	
	//这里打印的还是data1和data2的n内存地址的数值,
	//只要对data1和data2的地址进行数值改变就会发生变化 
	printf("data1:%p	data2:%p\n", &data1, &data2);
	printf("交换之后数据的值:%d, %d\n", data1, data2);
	
	return 0;
}
*/

解释:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值