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.rhkb.cn/news/108228.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12. Oracle中case when详解

格式&#xff1a; case expression when condition_01 then result_01 when condition_02 then result_02 ...... when condition_n then result_n else result_default end 表达式expression符合条件condition_01&#xff0c;则返回…

【算法专题突破】双指针 - 快乐数(3)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;202. 快乐数 - 力扣&#xff08;Leetcode&#xff09; 这道题的题目也很容易理解&#xff0c; 看一下题目给的示例就能很容易明白&#xff0c; 但是要注意一个点&#…

pycharm 右键运行代码时总是测试模式运行(run pytest)

*# 问题 使用pycharm时&#xff0c;右键运行代码&#xff0c;结果是这样的&#xff1a; 运行_‘pytesr(xxx.py 内)’ 英语界面可能是这样&#xff1a;run_‘pytesr(xxx.py)’我并不想使用测试模式。如何改回正常模式&#xff1f; 解决办法 本着遇到什么问题就搜什么问题的态…

【mindspore学习】环境配置

本次实验搭配的环境是 CUDA 11.6 CUDNN v8.9.4 TensorRT-8.4.1.5 mindspore 2.1.0。 1、配置 Nvidia 显卡驱动 如果原来的主机已经安装了 nvidia 驱动&#xff0c;为避免版本的冲突&#xff0c;建议先清除掉旧的 nvidia驱动 sudo apt-get --purge remove nvidia* sudo apt…

苍穹外卖总结

前言 1、软件开发流程 瀑布模型需求分析//需求规格说明书、产品原型↓ 设计 //UI设计、数据库设计、接口设计↓编码 //项目代码、单元测试↓ 测试 //测试用例、测试报告↓上线运维 //软件环境安装、配置第一阶段&#xff1a;需求分析需求规格说明书、产品原型一般来说…

系统架构设计师-计算机系统基础知识(1)

目录 一、计算机系统概述 1、冯诺依曼计算结构​编辑 二、存储系统 三、操作系统概述 1、特殊的操作系统 四、进程管理 1、进程与线程的概念 2、进程的同步与互斥 3、PV操作 4、死锁与银行家算法 一、计算机系统概述 1、冯诺依曼计算结构 二、存储系统 从上到下依次&#…

记录一个问题~beego中的配置文件autorender

事情的经过是这样的: 在学习beego框架时,遇到了一个问题: tpl模板文件不显示内容; 原因所在: beego配置文件: appname hello httpport 8080 runmode dev world world dataSourceInfo root:955945tcp(localhost:3306)/gmusic?charsetutf8 #自动渲染 这里关闭后就关闭了自…

【PHP面试题81】php-fpm是什么?它和PHP有什么关系

文章目录 &#x1f680;一、前言&#xff0c;php-fpm是什么&#x1f680;二、php-fpm与PHP之间的关系&#x1f680;三、php-fpm解决的问题&#x1f50e;3.1 进程管理&#x1f50e;3.2 进程池管理&#x1f50e;3.3 性能优化&#x1f50e;3.4 并发处理 &#x1f680;四、php-fpm常…

Redis7安装

1. 使用什么系统安装redis 由于企业里面做Redis开发&#xff0c;99%都是Linux版的运用和安装&#xff0c;几乎不会涉及到Windows版&#xff0c;上一步的讲解只是为了知识的完整性&#xff0c;Windows版不作为重点&#xff0c;同学可以下去自己玩&#xff0c;企业实战就认一个版…

LeetCode-406-根据身高重建队列

题目描述&#xff1a; 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造…

探讨uniapp的组件使用的问题

1 view Flex是Flexible Box的缩写&#xff0c;意为“弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 当设置display: flex后&#xff0c;继续给view等容器组件设置flex-direction:row或column&#xff0c;就可以在该容器内按行或列排布子组件。uni-app推荐使用flex布…

江西萍乡能源石油化工阀门三维扫描3d测量抄数建模-CASAIM中科广电

长期以来&#xff0c;石油天然气、石油石化、发电和管道输送行业在环保、健康和安全保障方面一直承受着巨大的压力&#xff0c;他们必须确保相关规程在各项作业中得到全面贯彻。 阀门作为流体管道运输中的组成部分&#xff0c;其装配密封度是保证流体运输安全的重要一环&#…

【Midjourney电商与平面设计实战】创作效率提升300%

不得不说&#xff0c;最近智能AI的话题火爆圈内外啦。这不&#xff0c;战火已经从IT行业燃烧到设计行业里了。 刚研究完ChatGPT&#xff0c;现在又出来一个AI作图Midjourney。 其视觉效果令不少网友感叹&#xff1a;“AI已经不逊于人类画师了!” 现如今&#xff0c;在AIGC 热…

尚硅谷宋红康MySQL笔记 10-13

是记录&#xff0c;我不会记录的特别详细 第10章 创建和管理表 标识符命名规则 数据库名、表名不得超过30个字符&#xff0c;变量名限制为29个只能包含 A–Z, a–z, 0–9, _共63个字符数据库名、表名、字段名等对象名中间不要包含空格同一个MySQL软件中&#xff0c;数据库不能…

Android 系统桌面 App —— Launcher 开发(1)

Android 系统桌面 App —— Launcher 开发&#xff08;1&#xff09; Launcher简介 Launcher就是Android系统的桌面&#xff0c;俗称“HomeScreen”也就是我们开机后看到的第一个App。launcher其实就是一个app&#xff0c;它的作用是显示和管理手机上其他App。目前市场上有很…

QT基础教程之二 第一个Qt小程序

QT基础教程之二 第一个Qt小程序 按钮的创建 在Qt程序中&#xff0c;最常用的控件之一就是按钮了&#xff0c;首先我们来看下如何创建一个按钮 QPushButton * btn new QPushButton; 头文件 #include <QPushButton>//设置父亲btn->setParent(this);//设置文字btn-&g…

C 连接MySQL8

Linux 安装MySQL 8 请参考文章&#xff1a;Docker 安装MySQL 8 详解 Visual Studio 2022 编写C 连接MySQL 8 C源码 #include <stdio.h> #include <mysql.h> int main(void) {MYSQL mysql; //数据库句柄MYSQL_RES* res; //查询结果集MYSQL_ROW row; //记录结…

基于大语言模型知识问答应用落地实践 – 知识库构建(上)

01 背景介绍 随着大语言模型效果明显提升&#xff0c;其相关的应用不断涌现呈现出越来越火爆的趋势。其中一种比较被广泛关注的技术路线是大语言模型&#xff08;LLM&#xff09;知识召回&#xff08;Knowledge Retrieval&#xff09;的方式&#xff0c;在私域知识问答方面可以…

R包开发-2.1:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)

目录 0-前言 1-在RStudio中创建R包项目 2-创建R包 2.1通过R函数创建新包 2.2在RStudio通过菜单来创建一个新包 2.3关于R包创建的说明 3-添加R自定义函数 4-添加C函数 0-前言 目标&#xff1a;在RStudio中创建一个R包&#xff0c;这个R包中包含C函数&#xff0c;接口是Rc…