【C语言】-初级指针


前言

在这里插入图片描述

很多人说指针是c语言的精华,是c语言最抽象最难懂的地方。但是事实上c语言指针就并没有那么抽象,用通俗的例子来说,指针就类似于一个人的家庭住址。


一、了解指针先了解内存

**内存是什么,通俗来说,内存就像一个一个的小单元被划分开,每一个小单元存储一个字节。**那么从开发者的角度,为了快速访问这些存储好的字节,即为了快速找到它的位置,就不得不发明出指针。因此我们引出指针的概念:
指针实际上就是内存单元的地址,就像一个人的家庭住址一样,你要找到这个人,你就可以通过他的家庭住址,快速来到他家门口找到他
而我们日常口中的指针其实就是指针变量,是用来存放指针的变量。

另外的思考题:一个地址可以存放一个字节,那么32根地址线最大可以存储多大的内存空间呢?64根地址线呢?

二、指针和指针类型

指针类型的意义:

1.决定访问的字节个数

指针类型决定解引用操作时访问几个字节(即有多大权限)char的指针解引用访问1个字节,int的指针访问4个字节,double*的指针访问8个字节。

2.决定指针的步长

指针类型决定指针的步长(向前/向后一步走多大的距离)int指针+1的意思是跳过一个整型,向后走4个字节,double指针+1的意思是跳过一个double型,向后走8个字节。

三、野指针

可以把野指针理解成一个野狗,是一个不确定的因素,我们知道指针是指向一个内存单元,野指针是指向一个我们不确定的内存单元,我们不知道里面存储着什么数据(可能是你后面需要用的),这时,你对野指针所指向的内存单元修改数据,会导致非常严重的后果。

1.野指针的成因

野指针的成因我总结为三类:
1.未初始化指针变量:这时指针变量里存储的是随机值,我们不知道它指向的是哪里

2.指针越界:例如你创建了一个十个大小的数组,而当你访问时,你访问到了第11个位置,这时,指针指向的区域也可能存储了别的重要数据,你可能对其进行了修改。

3.指针指向的空间释放:例如:当你使用一个函数,返回了一个指针变量时,这时这个指针变量其实已经被系统销毁了,已经返回给了系统,而你仍然要返回,同样的,你也不知道这时的指针被用来干了什么。

2.规避野指针

这里列举出来常见的容易规避野指针的方法,可能不全面,但已经包括常见的野指针的出现形式了

1.明确指针初始化
2.小心指针越界
3.指针指向空间释放,即使置为NULL
4.避免返回局部变量的地址
5.指针使用之前检查有效性

四、指针运算

1.指针加减整数

例如:
int* p = arr;
p = p+i;

这里的意义是,指针向后跳跃多少个整型步长的字节。即跳跃多少个整型

2.指针减指针

这个意义是可以求出两个指针中间有多少个这个指针类型的元素
例如这两个指针是整型,那么这两个指针变量相减得到的结果就是多少个整型

3.指针关系运算

两个指针可以比较大小

五、二级指针

二级指针通俗来讲。就是指向存放指针的指针。
用生活中的例子来说就是:
小明的家庭住址,那么小明的家庭住址就是小明的指针。我们把小明的家庭住址记录在一张纸上,而这张纸的放的位置,就是二级指针。比如,这张纸放在桌子上。那么我们可以通过纸的位置找到这张纸,再通过纸上记录的小明家的地址找到小明。

类似的我们同样可以类推出三级指针、四级指针…

六、指针数组

指针数组到底是指针呢,还是数组呢?
答案是,数组。
指针数组是存放指针的数组。
例如:
int* arr[]就是存放整型指针的数组
char* arr[]就是存放字符型指针的数组

思考题:如何用指针数组模拟二维数组?

答案:

#include<stdio.h>
int main()
{
	int a[] = { 1,2,3,4,5 };
	int b[] = { 2,3,4,5,6 };
	int c[] = { 3,4,5,6,7 };
	int d[] = { 4,5,6,7,8 };
	int* arr[] = { a,b,c,d };
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}
  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dontflinch

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

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

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

打赏作者

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

抵扣说明:

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

余额充值