【C语言】C/C++指针知识点复习(二)基操中的陷阱

本文详细讲解了一维数组和一级指针的概念,包括数组名的地址含义、指针运算技巧、指针在传递、查找与字符串操作中的实用案例。还介绍了二级指针和万能指针的基本概念,通过实例演示了它们的用法和类型转换的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、一维数组和一级指针

1、定义一个一维数组和一个一级指针:

int array[4]={0,1,2,3};	
int *p=array;

其中array为这个数组的首地址,等效&array[0];

(1):数组名代表数组所在一段内存的首地址

(2):数组的指针表示:array+i与&array[i]等效,代表下标为i的数组元素的地址;同理,*(array+i)与array[i]等效,代表数组下标为i的数组元素的值。

(3):指针指向数组后,可以用 *(p+i)或者p[i]代表数组的值(注意数组越界)。

2、常见用法以及优化

(1):指针传递

	int array[4] = { 1,2,3,4 };
	int *p = array+2;
	printf("%d\t", p[1]);

这个案例表示在这里插入图片描述
因此输出结果为4在这里插入图片描述
(2):便于查找数组中指定的元素,并快速修改

例如先查找数组中数值为2的元素,并返回其在数组中的位置(指定下标),并快速修改。

	int array[4] = { 0,1,2,3 };
	int pos = 0;
	int *p = array;
	while (p < array + 3 && *p != 2)
	{
		p++;	
		pos++;
	}
	printf("%d\t%d\n", *p,pos);
	*p = 50;//修改指定位置的值
	for (int i = 0; i < 4; i++)
	{
		
		printf("%d\t", array[i]);//打印数组元素
	}

打印结果:
在这里插入图片描述
(3):用来操作字符串

1、基操

	char *pStr = "i am a boy";
	printf("%s\n", pStr);
	char array[] = "i am a boy";
	pStr = array;
	printf("%c\n", *pStr);
	printf("%s\n", pStr);
	*pStr = 'M';
	printf("%s\n", pStr);

打印结果:

2、字符串连接与拷贝

字符串连接:

	char str[30] = { "YourApple" };
	char strConnect[] = { "juice" };
	char *p1 = str;
	char *p2 = strConnect;
	while (*p1 != '\0')
	{
		p1++;
	}
	while (*p2 != '\0')
	{
		*(p1++) = *(p2++);
	}
	printf("%s\n", str);

在这里插入图片描述
字符串拷贝:
注意字符串结束标记!!!!!

	char str[30] = { "YourApple" };
	char strConnect[] = { "juice" };
	char *p1 = str;
	char *p2 = strConnect;
	while (*p2 != '\0')
	{
		*(p1++) = *(p2++);
	}
	*p1 = '\0';//注意字符串结束标记!!!!!
	printf("%s\n", str);

在这里插入图片描述

都是基操,没啥可说,看看程序和图就懂了。

二、简单的二级指针和所谓万能指针

一级指针是存放变量的地址,那么二级指针就是存放一级指针的地址,以此类推,三级指针就是存放二级指针的地址等等。

	int a = 1;
	int *p = &a;
	int **pp = &p;
	printf("%d\n", **pp);

在这里插入图片描述

有些二级指针当做函数参数使用,例如在函数中修改某个指针的指向,跟在函数中用一级指针修改值有异曲同工之妙。

万能指针void*类型,可以指向任何类型的指针,也可以存储任意变量的地址。

	int a = 1;
	char b = 'a';
	void *p1 = &a;
	void *p2 = &b;
	printf("%d\n%c\n", *(int*)p1, *(char*)p2);

打印结果:
在这里插入图片描述
事实上,定义随便定义,但是使用的时候要进行类型的强制转换。

其次,void*类型可以传任何类型的参数;作为函数返回值,可以用强制转换赋值给任何类型的变量。

指针的东西实在是多,下回介绍一下指针的动态申请内存/二维数组与二级指针的操作/指针数组和数组指针的区分等。

如果有错误的地方希望大佬 可以批评指正,,有用的话顺便用您金贵的玉手点个赞,万分感谢!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值