栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022.3.15:C语言传参总结

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022.3.15:C语言传参总结

1.一维数组传参可写成arr和&arr

#define _CRT_SECURE_NO_WARNINGS 1

#include 
void test11(int arr[])
{
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("n");
}

void test12(int* p)                //arr表示数组首元素(1x1)地址,因此用指针接收,
{                                    p是指针,所以p+i指的是下一个元素(1x1)的地址,
	int i = 0;                       *(p + i)可列出所有元素
	for (i = 0; i < 5; i++)
	{
		printf("%d ", *(p + i));
	}
	printf("n");
}

void test2(int(*p)[5])       //&arr表示取整个数组的地址,因此要用指针数组接收,
{                        p是数组指针,所以p+i指的是下一个数组(1x5)的地址,所以不能用                              
	int i = 0;               *(p + i),*p表示得到了总个数组,实质是指得到了这个数组
	for (i = 0; i < 5; i++)  的第一个元素,而元素是以地址进行存储的,所以*p表示得到了
	{                        第一个元素(1x1)的地址,*(*p + i)依次能得到所有元素
		printf("%d ", *(*(p) + i)); 
	}
}

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	test11(arr);
	test12(arr);
	test2(&arr);
	return 0;
}

 1.二维数组传参可写成arr和&arr

#include 
void test11(int arr[][3])      
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("n");
	}
	printf("n");
}

void test12(int(*p)[3])         //arr表示数组首元素(1x3)地址,因此用数组指针接收,
{                                 p是数组指针,所以p+i指向下一个数组(1x3)的地址,
	int i = 0;                    所以p+i可用,因为有3行,*(p + i)表示某一行
	int j = 0;                    首元素(1x1)的地址,所以*(*(p + i)+ j)可列出所有
	for (i = 0; i < 3; i++)       元素
	{
		for (j = 0; j < 3; j++)
		{
			printf("%d ", *(*(p + i)+ j));
		}
		printf("n");
	}
	printf("n");
}

void test2(int(*p)[3][3])      //&arr表示取整个数组(3x3)的地址,因此用数组指针接收,
{                              p是数组指针,p+i表示下一个数组(3x3)的地址,所以p+i
	int i = 0;                 不能用,*p表示数组首元素(1x3)的地址,所以*p + i表示
	int j = 0;              下一个数组(1x3)的地址,是可以用的,因为有3行,*(*p + i)        
	for (i = 0; i < 3; i++)  +j)表示某一行数组首元素(1x1)的地址,所以*(*(*p + i) + 
	{                          j))可列出所有元素
		for (j = 0; j < 3; j++)
		{
			printf("%d ", *(*(*p + i) + j));
		}
		printf("n");
	}
	printf("n");
}

int main()
{
	int arr[3][3] = { { 1,2,3 },{4,5,6},{7,8,9} };
	test11(arr);
	test12(arr);
	test2(&arr);
	return 0;
}

 3.一级指针传参可写成p的形式

#include 
void test(int* p)
{
	printf("%dn", *p);
}

int main()
{
	int a = 5;
	int* p = &a;
	test(p);
	return 0;
}

 

4.二级指针传参可写成&p的形式

#include 
void test(int** pp)
{
	printf("%dn", **pp);
}

int main()
{
	int a = 5;
	int* p = &a;
	int** pp = &p;
	test(pp);
	return 0;
}

5. 函数指针数组可简化代码

//计算器程序
#include 

int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}

void menu()
{
	printf("**************************n");
	printf("****  1.add   2.sub   ****n");
	printf("****  3.mul   4.div   ****n");
	printf("****  0.exit          ****n");
	printf("**************************n");
}
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入2个操作数:>");
			scanf("%d%d", &x, &y);
			ret = Add(x, y);
			printf("ret = %dn", ret);
			break;
		case 2:
			printf("请输入2个操作数:>");
			scanf("%d%d", &x, &y);
			ret = Sub(x, y);
			printf("ret = %dn", ret);
			break;
		case 3:
			printf("请输入2个操作数:>");
			scanf("%d%d", &x, &y);
			ret = Mul(x, y);
			printf("ret = %dn", ret);
			break;
		case 4:
			printf("请输入2个操作数:>");
			scanf("%d%d", &x, &y);
			ret = Div(x, y);
			printf("ret = %dn", ret);
			break;
		case 0:
			printf("退出计算器n");
			break;
		default:
			printf("选择错误n");
			break;
		}
	} while (input);

	return 0;
}
//计算器程序
#include 
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}

void menu()
{
	printf("**************************n");
	printf("****  1.add   2.sub   ****n");
	printf("****  3.mul   4.div   ****n");
	printf("****  0.exit          ****n");
	printf("**************************n");
}
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;

	//转移表
	int (*pfArr[])(int, int) = { 0, Add, Sub, Mul, Div };

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		if (input == 0)
		{
			printf("退出计算器n");
		}
		else if (input >= 1 && input <= 4)
		{
			printf("请输入2个操作数:>");
			scanf("%d%d", &x, &y);
			ret = pfArr[input](x, y);
			printf("ret = %dn", ret);
		}
		else
		{
			printf("选择错误n");
		}

	} while (input);

	return 0;
}

6. 函数(Add)中:Add == &Add,    *p(1,2) == p(1,2)

#include 
int Add(int x, int y)
{
	return (x + y);
}
int main()
{
	printf("%pn", Add);
	printf("%pn", &Add);

	return 0;
}

 

#include 
int Add(int x, int y)
{
	return (x + y);
}
int main()
{
	int(*p)(int, int) = Add;
	printf("%dn", (*p)(3, 2));
	printf("%dn", p(3, 2));
	return 0;
}

 

6. 1)一维数组首元素地址就是第1个元素的地址,二维数组首元素地址就是第1行的地址,

    2) int(*p)[3][5]这里面的3不能省略,而int arr[3][5]的3可省略,

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767785.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号