C语言 函数参数

基础

  1. 函数的形参都是原数据的“副本”,在函数自己栈中申请内存
  2. 函数中参数都是传值,传指针本质上也是传值
  3. 如果想要改变入参内容,则需要传该入参的地址(指针和引用(c++)都是类似的作用)

形参与实参

普通变量参数

  1. 函数内部用的参数是形参,传入函数的参数是实参
  2. 形参会在函数栈空间再开辟内存,复制实参的内容
  3. 函数结束后,栈空间,形参也随之消失
#pragma warning(disable:4996)
#include <stdio.h>
void test(int a)
{
	printf("形参地址:%x,值:%d\n",&a,a);//形参地址:4ffc70,值:10
	return;
}

int main(int argc, char *argv[])
{
	int a = 10;
	printf("实参地址:%x,值:%d\n", &a,a);//实参地址:4ffb9c,值:10
	test(a);
	system("pause");
	return 0;
}

指针作为参数

指针参数

  1. 函数不需要再为形参开辟存储int类型的空间
#pragma warning(disable:4996)
#include <stdio.h>
void test(int *a)
{

	*a = *a + 1;
	printf("改变中,形参地址:%x,值:%d\n", a, *a); //改变中, 形参地址 : 95f81c, 值 : 11
}


int main(int argc, char *argv[])
{
	int a = 10;
	printf("改变前,实参地址:%x,值:%d\n", &a, a);//改变前, 实参地址:95f81c, 值 : 10
	test(&a);
	printf("改变后,实参地址:%x,值:%d\n", &a, a);//改变后, 实参地址 : 95f81c, 值 : 11
	system("pause");
	return 0;
}

  1. 本质是为形参开辟了指针类型的空间(所以形参就是副本,即使传入的是指针类型,不过是两个不同地址的指针指向同一个地址而已)
#pragma warning(disable:4996)
#include <stdio.h>
void test(int *a)
{
	printf("形参指针地址:%x\n", &a); //实参指针地址:75f7dc
}


int main(int argc, char *argv[])
{
	int a = 10;
	int *p = &a;
	printf("实参指针地址:%x\n", &p);//形参指针地址 : 75f708
	test(p);
	system("pause");
	return 0;
}

数组参数

  1. 数组名本身就是指针
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//1、数组作为函数参数可以退化为指针
//2、在传递数组时需要加上数组的个数

void print01(int * arr, int len)//`int * arr`等价于`int arr[10]`
{
	//函数参数中如有有数组  都会转化为指针  sizeof(int *)  4  所以求出来的值不能作为数组的循环条件存在
	for (int i = 0; i < len; i++)
	{
		printf("%d\n", arr[i]);
	}
}

int main(int argc, char *argv[])
{
	int arr[] = { 1,2,3,4,6,0,7,8,9,10 };

	print01(arr, sizeof(arr) / sizeof(arr[0]));
	system("pause");
	return EXIT_SUCCESS;
}

返回


#pragma warning(disable:4996)
#include <stdio.h>
int* test(int a)
{
	printf("形参地址:%x,值:%d\n",&a,a); //形参地址:4ffc70,值:10
	return &a;
}


int main(int argc, char *argv[])
{
	int a = 10;
	printf("实参地址:%x,值:%d\n", &a,a);//实参地址:4ffb9c,值:10
	int* p = test(a);
	printf("返回地址:%x,值:%d\n", p, *p);//返回地址:4ffc70,值:10
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值