C.11: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+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+i指的是下一个数组(1x5)的地址,                             
	int i = 0;               *p表示得到了arr,实质是指得到了这个数组
	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;
}

C.11:C语言传参总结_第1张图片

 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+i指下一个数组arrj[3](1x3)的地址,
	int i = 0;                   等于&arrj,所以*(p + i)等于arrj,arrj就是数组arrj(1x3)
	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+i表示下一个数组(3x3)的地址,
	int i = 0;                 *p表示数组首元素(1x3)的地址,所以*p + i指下一
	int j = 0;              个数组arrj[3](1x3)的地址,等于&arrj,*(*p + i)        
	for (i = 0; i < 3; i++) 等于arrj,表示数组arrj[3](1x3)首元素(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;
}

C.11:C语言传参总结_第2张图片

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

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

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

C.11:C语言传参总结_第3张图片

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

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

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

C.11:C语言传参总结_第4张图片

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 = %d\n", ret);
			break;
		case 2:
			printf("请输入2个操作数:>");
			scanf("%d%d", &x, &y);
			ret = Sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("请输入2个操作数:>");
			scanf("%d%d", &x, &y);
			ret = Mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("请输入2个操作数:>");
			scanf("%d%d", &x, &y);
			ret = Div(x, y);
			printf("ret = %d\n", 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 = %d\n", 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("%p\n", Add);
	printf("%p\n", &Add);

	return 0;
}

C.11:C语言传参总结_第5张图片

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

C.11:C语言传参总结_第6张图片

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

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

    3) 打印一个字符串只要告诉这个字符串的首地址即可,然后%s打印即可,

   4)

char* p1 = "abcdef";    //这里的p1 == p2,指向的都是a
char* p2 = "abcdef"; 

char* p1[] = "abcdef";    //这里的p1 != p2,这是2个数组里放a,数组不同,地址当然不同
char* p2[] = "abcdef"; 

    5)与地址相关的问题记住下面几句话即可:

        1.数组名通常来说是数组首元素的地址

        2.但有2个例外,sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小

        3.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址

        4.一维数组首元素的地址指第一个元素的地址,二维数组首元素的地址指第一行的地址

        5.理解 int* p = &a 的意思:p == &a,&a是int*类型

你可能感兴趣的:(c语言,蓝桥杯,c++)