您现在的位置是:首页 > 正文

指针的初阶

2023-11-06 15:35:10阅读 20

目录

1.指针是什么?

2.指针的类型和解引用

3.野指针

4.指针的运算

5. 指针和数组

6. 二级指针


这篇文章是对指针进行一个初步的认识,往下了解吧!

1.指针是什么?

1. 指针是内存中一个最小单元的编号,也就是地址
2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量

总结:指针就是地址,口语中说的指针通常指的是指针变量。

2.指针的类型和解引用

2.1 指针的类型

我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?

答案肯定是有的

例如:

int a = 10;
 p = &a;

将&a(a的地址)保存到p中,我们知道p就是一个指针变量

p的类型应该就为int*;

char  *pc = NULL;
int  *pi = NULL;
short *ps = NULL;
long  *pl = NULL;
float *pf = NULL;
double *pd = NULL;

所有我们能得出:指针的定义方式是: type + * 。

char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。

2.2  指针的解引用

例一:

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

例二:

#include <stdio.h>
//演示实例
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);//0073FA44
printf("%p\n", pc);//0073FA44
printf("%p\n", pc+1);//0073FA45
printf("%p\n", pi);//0073FA44
printf("%p\n", pi+1);//0073FA48

return 0
}

首先pc和pi取得是n首元素的地址 所以他们是相同的

由于pc是char*类型 而pi是int*类型 他们地址加1的情况会不同

char*指针跳过一个字节,而int*跳过4个字节

总结:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

3.野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

错误用法:

3.1 指针未初始化

int main()
{
	int* p;
	*p = 20;
}

首先这种写法就是不可取的,编译的时候会报错,因为*p未初始化

如何改正呢?

#include <stdio.h>
int main()
{
	int* p=NULL;
	*p = 20;
}

这样就不会报错,NULL相当于0对于指针变量;

3.2 指针越界访问

虽然可以运行,但明显arr数组里有10个元素,却要访问了11个元素,访问不到第11个元素,所以会产生随机值,这也是野指针。

这里可以看见 当下标为10的时候已经超出arr数组的范围了,还给它赋值为-1,已经非法或越界访问了,所以直接报错;

3.3 规避野指针

那么改如何避免这些情况呢?

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

4.指针的运算

4.1 指针+-整数

这其实就是一个很好的例子 

首先 p+0 指向的是第一个元素的地址 在对解引用 *(p+0) 就可以拿到0

如何 p+1指向的是第二个元素的地址 在对解引用 *(p+1) 就可以拿到1...

4.2 指针-指针

实例:用指针-指针的方法模拟实现strlen函数 

//strlen函数求字符串长度

strlen模拟实现:

5. 指针和数组

指针是指针 指针变量是一组变量 指针存放的是地址 指针的大小是4/8个字节

数组是数组 可以存放一组数 数组的大小由它的类型来决定

数组的数组名是首元素的地址 地址可以访问到指针变量中

一般情况下,数组名是首元素的地址,只有在这俩种情况下 表示的数组的地址

1.sizeof(arr)   

2.&arr

&arr是取出整个数组的地址 &arr[0]是首元素的地址

这样看虽然他们的地址相同 但意义不一样

这样就可以看出差别很大 首先&arr是取出整个数组的地址 所以+1跳过的4*10个字节空间

而&arr[0]+1则跳过的4个字节的空间

数组和指针结合使用

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
	int* p = arr; //指针存放数组首元素的地址
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p + i);
	}
	return 0;
}

这样更容易能看出通过指针变量就能找到数组中的元素

6. 二级指针

#include <stdio.h>
int main()
{
	int a = 10;
	int* p = &a;//p是指针变量,它是一级指针,存放a的地址
	int* * pp = &p;//pp是指针变量,它是二级指针  存放一级指针p的地址

}

对于二级指针的运算有:
*p 通过对a中的地址进行解引用,这样找到的是 a , *p 其实访问的就是 a

pp 先通过 pp 找到 p,先解引用*pp找到p ,然后对 p 进行解引用操作: *p ,那找到的是 a .

小结:这一次是对指针的初步认识,指针的内容还有一大块需要我们去开掘,小编之后还会继续完善指针的内容,大家一起努力吧!

文章来源:https://blog.csdn.net/chaodddddd/article/details/132748289
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://www.dflian.com/949.html

网站文章

  • xshell ssh连接linux时提示ssh服务器拒绝了密码

    xshell ssh连接linux时提示ssh服务器拒绝了密码

    xshell ssh连接linux时提示ssh服务器拒绝了密码

    2023-11-06 15:35:07
  • Go 异步任务

    Go 异步任务

    异步任务在开发中很常见,用来做解耦。本文介绍一下异步队列的实现的几个问题,并且结合三方库实现来分析。带着上面的问题,对比https://github.com/golang-queue/queue的实现,说明一下。

    2023-11-06 15:35:00
  • 【web前端】web前端设计入门到实战第一弹——html基础精华

    【web前端】web前端设计入门到实战第一弹——html基础精华

    一:图片属性 二:音频标签 三: 视频标签 四:链接标签 五:列表标签 5.1.无序列表 5.2.有序列表 5.3.自定义列表 六:表格 6.1合并单元格 七:input标签 八:select系列 九: 文本域标签 十:label标签十一:语义化标签 十二:字符实体

    2023-11-06 15:34:57
  • SpringBoot如何自动生成实体类和Dao层以及映射文件

    SpringBoot如何自动生成实体类和Dao层以及映射文件 一、首先添加自动生成代码插件 org.mybatis.generator ...

    2023-11-06 15:34:51
  • Java中的接口和抽象类有什么区别?

    Java中的接口和抽象类有什么区别?

    接口和抽象类是 Java 面向对象设计的两个基础机制。接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。接口,不能实例化;不能包含任何非常量成员,任何 field...

    2023-11-06 15:34:45
  • Java的日期与时间java.time.Duration的简介说明

    Java的日期与时间java.time.Duration的简介说明

    2023-11-06 15:34:41
  • WEB编程:期末展示

    WEB编程:期末展示

    期末大作业展示:一、项目要求1、用户可注册登录网站,非注册用户不可登录查看数据2、用户注册、登录、查询等操作记入数据库中的日志3、爬虫数据查询结果列表支持分页和排序4、用Echarts或者D3实现3个...

    2023-11-06 15:34:39
  • sklearn 内置数据集-威斯康星州乳腺癌数据集

    威斯康星州乳腺癌数据集是scikit-learn(sklearn)库中一个常用的内置数据集,用于分类任务。该数据集包含了从乳腺癌患者收集的肿瘤特征的测量值,以及相应的良性(benign)或恶性(mal...

    2023-11-06 15:34:34
  • CentOS7配置阿里yum源 超详细!!!

    CentOS7配置阿里yum源 超详细!!!

    centos7配置阿里yum源(奥里给)

    2023-11-06 15:34:32
  • Java基础篇

    Java基础篇

    史上最全最细致最完整的Java基础八股文,全篇文章图文并茂,每个知识点都有深入讲述,致力于让读者深刻理解Java基础,更好地应用面试!

    2023-11-06 15:34:27