C语言进阶02

本部分包含指针进阶。字符指针、指针数组、函数指针、函数指针数组、指向函数指针数组的指针、回调指针、回调函数。

笔记部分:

  • 1. 字符指针
    • 例题:

    • 解析:
      • 这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块,所以str1和str2不同,str3和str4相同。
  • 2. 指针数组
    • 示例:

    • 图示:

  • 3. 数组指针
    • 数组指针的定义 :是指向数组的指针。数组指针是指针。
    • &数组名VS数组名
      • 数组名表示数组首元素的地址。
      • &arr 表示的是数组的地址,而不是数组首元素的地址。
    • 数组指针的使用
      • 数组指针中存放的是数组的地址。
  • 4. 数组传参和指针传参
  • 5. 函数指针
    • 一维数组图示:

    • 二维数组传参

    • 一级指针传参

    • 二级指针传参

  • 6. 函数指针数组
    • 函数指针
      • 函数指针:存放函数地址的指针
      • &函数名,取的是函数的地址。函数名本身就是地址。
      • 函数指针的定义:返回值类型 (*函数指针变量名)(参数类型)=&函数名;
      • 图示:

    • 函数指针数组
      • 语法:返回值类型 (*函数指针变量名)(参数类型)=&函数名;
      • 函数指针数组的用途:转移表
  • 7. 指向函数指针数组的指针
    • 指向函数指针数组的指针是一个 指针
    • 指针指向一个 数组 ,数组的元素都是 函数指针

  • 8. 回调函数
    • 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

代码部分:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

void print1(int arr[3][5], int r, int c)
{
	for (int i = 0;i < r;i++)
	{
		for (int j = 0;j < c;j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}

void print2(int(*p)[5], int r, int c)
{
	for (int i = 0;i < r;i++)
	{
		for (int j = 0;j < c;j++)
		{
			printf("%d ", *(*(p+i)+j));
		}
		printf("\n");
	}
}

//计算器
void menu()
{
	printf("***********************\n");
	printf("*****1.add    2.sub****\n");
	printf("*****3.mul    4.div****\n");
	printf("*****     0.exit   ****\n");
	printf("***********************\n");
}

int Add(int a, int b)
{
	return a + b;
}

int Sub(int a, int b)
{
	return a - b;
}

int Mul(int a, int b)
{
	return a * b;
}

int Div(int a, int b)
{
	return a / b;
}

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

int main()
{
	////字符指针
	//char str1[] = "hello bit.";
	//char str2[] = "hello bit.";
	//const char* str3 = "hello bit.";
	//const char* str4 = "hello bit.";
	//if (str1 == str2)
	//	printf("str1 and str2 are same\n");
	//else
	//	printf("str1 and str2 are not same\n");

	//if (str3 == str4)
	//	printf("str3 and str4 are same\n");
	//else
	//	printf("str3 and str4 are not same\n");


	////指针数组
	//int a[] = { 1,2,3,4,5,6 };
	//int b[] = { 2,3,4,5,6,7 };
	//int* p1[5] = { a,b };
	//for (int i = 0;i < 2;i++)
	//{
	//	for (int j = 0;j < 6;j++)
	//	{
	//		printf("%d", *(p1[i] + j));
	//		//printf("%d", *arr[i][j]);
	//	}
	//	printf("\n");
	//}

	////数组指针
	//int* c[4];
	//int* (*pc)[4] = &c;

	//int d[10] = { 1,2,3,4,5 };
	//int(*pd)[10] = &d;

	//int* e[3][5] = { {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15} };
	//print1(e, 3, 5);
	//print2(e, 3, 5);


	////函数指针
	//void (*ppr)(int, int, int) = print1;
	//ppr(e, 3, 5);

	////函数指针数组
	//int (*prArr[2])(int, int, int) = { print1,print2 };
	//计算器
	
	
	int input = 0;
	do
	{
		menu();
		printf("请输入》\n");
		scanf("%d", &input);
		int (*pfArr[5])(int, int) = { NULL,Add,Sub,Mul,Div };
		int x, y;
		if (input > 0 && input < 5)
		{
			printf("请输入两个操作符\n");
			scanf("%d %d", &x, &y);
			int ret = (*pfArr[input])(x, y);
			printf("结果为%d\n", ret);
		}
		else if (input == 0)
		{
			printf("退出程序");
		}
		else
		{
			printf("输入错误,请重输");
		}
	} while (input);

	//qsort()快速排序
	int arr1[] = { 1,3,2,4,5 };
	int size = sizeof(arr1) / sizeof(arr1[0]);
	qsort(arr1,size,sizeof(arr1[0]),cmp_int);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ohrkaninchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值