0


【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>intmain(){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");}return0;}
标签: c语言 c++

本文转载自: https://blog.csdn.net/flin666/article/details/126554908
版权归原作者 Dontflinch 所有, 如有侵权,请联系我们删除。

“【C语言】-初级指针”的评论:

还没有评论