当前位置: 首页 > news >正文

C语言基础之——指针(上)

前言:小伙伴们又见面啦!本期内容,博主将展开讲解有关C语言中指针的上半部分基础知识,一起学习起来叭!!!


目录

一.什么是指针

二.指针类型

1.指针的解引用

2.指针+-整数

三.野指针

1.野指针成因

(1)指针未初始化

 (2)指针越界访问

2.如何规避野指针

四.总结


一.什么是指针

  1. 指针是内存中一个最小单元的编号,也就是地址
  2. 我们平时所说到的指针,一般都是指针变量,是用来存放内存地址的变量

所以说指针实际上是一个地址,而存放在指针中的值都会被当成地址处理。

这里有一个小知识点:指针在32位平台上占4个字节,在64位平台上则占8个字节。具体内容相对复杂,我们这里不做讲述。

还有一点要注意,一个指针虽然占有四个字节,但是它存储的地址仅仅为一个字节,也就是这四个字节的头头。

二.指针类型

我们知道,定义一个指针变量就跟定义一个普通的变量一样,可以有不同的类型。

那我们又知道不同类型的变量,又会占有不同的内存大小。

那么不同类型的指针,也会占有不同的内存大小吗??? 

#include<stdio.h>
int main()
{printf("%d\n", sizeof(int*));printf("%d\n", sizeof(char*));printf("%d\n", sizeof(short*));printf("%d\n", sizeof(double*));return 0;
}

 我们知道sizeof是一个计算内存大小的关键字,我们用它来测试一下,结果如下:

 令人出乎意料,不同类型的指针变量,占用的内存大小竟然都相同,为什么呢???

事实上,我们定义不同类型的指针,只是为了用这个指针来存放这种类型的变量的地址

例如我们定义char*类型的指针,只是为了存放char类型变量的地址

那既然并不会影响指针的内存大小,定义这么多类型的指针又有什么意义呢???

1.指针的解引用

什么是指针的解引用呢???

当我们用指针变量通过地址来访问或者修改一个变量的值,就叫解引用。

#include<stdio.h>
int main()
{int n = 0x11223344;int* p = &n;*p = 0;return 0;
}

假如我们初始化变量n的内存大小为0x11223344,然后我们用int型的指针变量来解引用将其值改为0,我们来看它的内存怎么变化:

 可以看出n的四个字节的内存大小都变为了0

#include<stdio.h>
int main()
{int n = 0x11223344;char* p = &n;*p = 0;return 0;
}

 同样的方式,这次我们换成char型的指针变量,又会是什么结果呢???

 可以很轻易的看出,char型的指针变量,仅仅让n的一个字节的内存大小变为了0

 这便是指针类型的意义:

指针类型决定了指针进行解引用操作的时候,访问几个字节。

2.指针+-整数

#include<stdio.h>
int main()
{int n = 5;int* p1 = &n;char* p2 = &n;printf("p1 = %p\n", p1);printf("p1 + 1 = %p\n", p1 + 1);printf("p2 = %p\n", p2);printf("p2 + 1 = %p\n", p1 + 1);return 0;
}

看这段代码,int型的指针变量p1和char型的指针变量p2的内存地址是什么结果

p1和p2两个指针分别 + 1之后又会是什么结果呢

 能够看出,两个指针变量是可以同时访问一个变量的地址的。

p1+1的后的内存跳过了4个字节,而p2+1后的内存地址仅仅之跳过了1个字节

这也是指针类型的意义:

指针类型决定了指针进行+-操作的时候,跳过几个字节。

三.野指针

所谓野指针,也就是说指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)

1.野指针成因

(1)指针未初始化

int *p;

*p = 10;

这样的解引用方式直接就是错误的,在VS环境下直接就会报错:

 (2)指针越界访问

#include<stdio.h>
int main()
{int arr[10] = { 0 };int* p = arr;int i = 0;for (i = 0; i <= 10; i++){*p = 1;p++;}return 0;
}

假如我们想用一个指针来改变数组中的每一个值,但是却不小心超过了数组的大小,这样就造成了越界访问,出现了错误。

指针指向的地址超过了数组的范围,就变成了野指针

2.如何规避野指针

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

这里要注意一点,如果我们非要定义一个未知指向的指针,就要将其置NULL,也就是置0

当指针置NULL时,也相当于是存了一个空地址,不能对这个地址直接进行操作。

想要操作此指针,就必须让它指向其他已知的地址

四.总结

以上就是有关C语言基础——指针的上半部分的内容啦,稍后博主将更新指针(下),一起期待一下叭!

喜欢博主文章的小伙伴们不要忘记一键三连哦!

我们下期再见!

http://www.lryc.cn/news/141711.html

相关文章:

  • 构建 NodeJS 影院预订微服务并使用 docker 部署(04/4)
  • SpringBootWeb案例 Part3
  • C++中using 用法
  • window下jdk安装及更换jdk版本的一些问题。
  • GPT4模型架构的泄漏与分析
  • GEE/PIE遥感大数据处理与典型案例丨数据整合Reduce、云端数据可视化、数据导入导出及资产管理、机器学习算法等
  • STM32--DMA
  • mongodb和redis的用途
  • 【动手学深度学习】--18.图像增广
  • 数据分析--统计学知识
  • matlab 计算点云协方差矩阵
  • python进阶之图像编程 pillow扩展库
  • TiCDC Canal-JSON 消息接收示例(Java 版)
  • SQLite、MySQL、PostgreSQL3个关系数据库之间的对比
  • 开源容灾备份软件,开源cdp备份软件
  • Java合并区间
  • 前端面试:【代码质量与工程实践】单元测试、集成测试和持续集成
  • 2023/8/17总结
  • REDIS 7 教程 数据类型-进阶篇
  • 图文并茂:Python Tkinter从入门到高级实战全解析
  • npm和yarn的区别?
  • 微服务项目容器编排docker-compose.yml、Dockerfile文件模板、相关配置文件、shell脚本
  • 算法通过村第三关-数组黄金笔记|数组难解
  • 【2023】LeetCode HOT 100——矩阵
  • springboot源码方法
  • 基于java街球社区网站设计与实现
  • 定时产生不同频率方波
  • Java“牵手”天猫商品sku信息API接口数据,天猫API接口申请指南
  • 【⑮MySQL | 视图】概述 | 创建 | 查看 | 更新 | 修改 | 删除
  • Linux驱动开发一、RK3568把hello编译到Linux内核中运行。‘rk_vendor_read’未定义的引用