指针知多少

本文详细介绍了C语言中的指针概念,包括字符指针、指针数组、数组指针、指针参数、函数指针和函数指针数组。通过实例展示了它们的用法和区别,帮助读者深入理解指针的使用和作用。同时提供了练习链接以供进一步学习和巩固。
摘要由CSDN通过智能技术生成

作者简介:დ旧言~,目前大一,现在学习Java,c,Python等
座右铭:松树千年终是朽,槿花一日自为荣。
望小伙伴们点赞👍收藏✨加关注哟💕💕

⛵前言

不知道大家还记不记得初阶的指针☺️,那时我们讲的很浅🤔,只是知道有指针这玩意,看起来也迷迷糊糊😒,今天我们系统的来讲解指针,到底看看指针是否向传闻中的难到哭😮‍💨,话不多说正式进入今天的主题—C语言指针进阶 。

⛵主体

①字符指针

💤字符指针是什么

字符指针 == char* p

💤字符指针使用

#include<stdio.h>
int main()
{
	char* ptr = "hello world.";
	printf("%s\n", ptr);
	return 0;
}

💦"hello world."字符串本质上是把首元素的地址给字符指针(首字符h的地址存放到指针变量ptr中

💤举个栗子

#include <stdio.h>
int main()
{
	char str1[] = "hello world.";
	char str2[] = "hello world.";
	const char* str3 = "hello world.";
	const char* str4 = "hello world.";
	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");
	return 0;
}

这里加const修饰的变量是不可以被修改的,而上面的代码结果是什么呢?让我们仔细来探讨探讨。🧐🧐🧐
在这里插入图片描述
不难看出,str1和str2分别开辟了不同空间,而被const修饰的"hello world."已在栈区开辟好了空间,因此str3和str4都指向同一个字符串。
在这里插入图片描述

②指针数组

💤指针数组是什么

指针数组 == int* p[10]

这里我们要明白,指针数组是指针还是数组?这里我们仔细来讲解,因为[]的优先级比 * 高,因此p是一个数组,有10个元素,每个元素的类型都是 int *,因此指针数组,本质还是数组。
在这里插入图片描述
在这里插入图片描述
这里我就不举例了,这里会和数组指针一起来举例子。

③数组指针

💤数组指针是什么

数组指针 == int(* p)[10]

这里我们要明白,指针数组是指针还是数组?这里我们仔细来讲解,因为()的优先级比 [] 高,因此p是一个指针,指向数组,数组有10个元素,因此数组指针,本质还是指针。

💤数组指针和指针数组比较

指针数组 == int* p[10] ➡️本质是数组
数组指针 == int(* p)[10] ➡️本质是指针

💤&数组名VS数组名

&数组名VS数组名都表示数组首元素的地址,但是有特例:

💫特例:
1️⃣sizeof(数组名):表示的是整个数组
2️⃣&数组名:取出的是整个数组

💤数组指针使用

大家不知道有没有看过博主的写的三子棋和扫雷,这里就用到数组指针,

#include <stdio.h>
void print_arr1(int arr[3][5], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
void print_arr2(int(*arr)[5], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
int main()
{
    //定义一个二维数组
	int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
	//调用函数
	print_arr1(arr, 3, 5);
	print_arr2(arr, 3, 5);
	return 0;
}

这里我们写上主函数,定义一个二维数组,开始调用函数,第一个函数使用最初我们常见的知识写的,后面的函数采用数组指针。
在这里插入图片描述

💤举个栗子

1️⃣int arr[5];
2️⃣int *arr1[10];
3️⃣int (*arr2)[10];
4️⃣int (*arr3[10])[5];

1.arr是个数组,数组里面有5个元素,每个元素类型为int。
2.arr是个数组,数组里面有10个元素,每个元素类型为int*。
3.arr是个指针,指针指向一个数组,数组有10个元素,每个元素类型为int。
4.arr是个数组,数组有10个元素,每个元素是个指针,指向一个数组,数组有5个元素,每个元素类型为int。

④指针参数

💤一级指针传参

#include <stdio.h>
void print(int *p, int sz)
{
 int i = 0;
 for(i=0; i<sz; i++)
 {
 printf("%d\n", *(p+i));
 }
}
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9};
 int *p = arr;
 int sz = sizeof(arr)/sizeof(arr[0]);
 //一级指针p,传给函数
 print(p, sz);
 return 0;
}

💤二级指针传参

#include <stdio.h>
void test(int** ptr)
{
	printf("num = %d\n", **ptr);
}
int main()
{
	int n = 10;
	int* p = &n;
	int** pp = &p;
	test(pp);
	test(&p);
	return 0;
}

⑤函数指针

💤函数指针是什么

函数指针 == int (*p)(int ,int )

这里我们要明白,函数指针是指针还是函数?这里我们仔细来讲解,p是一个指针,指向函数,返回类型为int,因此函数指针,本质还是指针。

⑥函数指针数组

💤函数指针数组是什么

函数指针数组 == int (*p[10])(int ,int )

这里我们可以解读为,有一个数组,数组的元素有10个,每个元素是指针,并且指向函数,返回类型是int

💤举个栗子

这里我们再实现简单的计算机。

💤方法一
#include <stdio.h>
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 main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	do
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = add(x, y);
			printf("ret = %d\n", ret);
			break;
		case 2:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("输入操作数:");
			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 <stdio.h>
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 main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	//这里我们传入函数的地址,实现选择
	int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; 
	while (input)
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);
		if ((input <= 4 && input >= 1))
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y);
		}
		else
			printf("输入有误\n");
		printf("ret = %d\n", ret);
	}
	return 0;
}

⑦指向函数指针数组的指针

这里我就不在介绍了,大家自己上网查阅,看看这块知识点。

⛵指针拓展与练习

💦练习
https://blog.csdn.net/AAlykk/article/details/131631154
💦拓展
https://blog.csdn.net/AAlykk/article/details/131599017

大家可以好好看看这两篇博客,对指针认识会更加深刻。

⛵结束语🎉🎉🎉

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。
在这里插入图片描述

评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值