【C语言】入门——指针
目录
编辑
1.指针是什么
2.指针类型和指针运算
2.1指针+-整数
2.2指针-指针
2.3指针的关系运算
3.野指针
3.1野指针成因
👍指针未初始化:
👍指针越界访问:
👍指针指向空间释放:
3.2如何规避野指针
4.指针和数组
5.二级指针
6.指针数组
1.指针是什么
指针,是C语言中的一个重要概念及其特点,也是C语言比较难的部分。
👍.内存被划分成一个个的内存单元,每个内存单元的大小是1个字节
👍.每个字节的内存单元都有一个编号,这个编号就是地址,地址在C语言中称为指针
👍.地址要存储的话,存放在指针变量中
👍.每个内存单元都有一个唯一的地址来标识
👍.在32位机器上地址的大小是4个字节,所以指针变量的大小也是4个字节同理:在64位机器上地址的大小是8个字节,所以指针变量的大小也是8个字节
总结:指针就是地址,口语中说的指针通常指的是指针变量。
2.指针类型和指针运算
👍变量的创建可以使用不同的类型,而指针也有不同的指针类型
char *pc = NULL; //字符指针
int *pi = NULL; //整形指针
short *ps =NULL; //短整型指针
long *pl = NULL; //长整型指针
float *pf = NULL; //单精度浮点型指针
double *pd = NULL; //双精度浮点型指针
……
2.1指针+-整数
👍指针类型决定了指针进行解引用操作的时候,访问几个字节
int* 访问4个字节
char* 访问1个字节
short* 访问2个字节
👍指针类型决定了指针+1,-1跳过几个字节:
int* 的指针+1,跳过4个字节;
char* 的指针+1,跳过1个字节;
short* 的指针+1,跳过2个字节;
double* 的指针+1,跳过8个字节
总结:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)
比如:char* 的指针解引用就只能访问1个字节,而int* 的指针解引用能访问4个字节
int main()
{int n = 10;char* pc = (char*)&n;int* pi = &n;//打印n的地址printf("%p\n", &n);printf("%p\n", pc);printf("%p\n", pc + 1);//打印char型跳过一个字节printf("%p\n", pi);printf("%p\n", pi + 1); //打印整型指针跳过4个字节//0019FB40/*0019FB400019FB410019FB400019FB44*/return 0;
}
2.2指针-指针
👍指针-指针的前提:两个指针指向同一块区域,指针类型是相同的;
👍指针-指针得到的是:两个指针之间的元素个数;
(如果是小地址-大地址就是负的元素个数)
int arr[10] = { 0 };printf("%d\n", &arr[9] - &arr[0]); //9printf("%d\n", &arr[0] - &arr[9]); //-9//两个指针相减的前提是:指针指向的同一块连续的空间
2.3指针的关系运算
👍标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
#define N_VALUES 5
float values[N_VALUES];
float *vp;
for (vp = &values[0]; vp < &values[N_VALUES];)
{*vp++ = 0; }
3.野指针
3.1野指针成因
👍指针未初始化:
int main()
{ int *p;//局部变量指针未初始化,默认为随机值*p = 10;return 0;
}
👍指针越界访问:
int main()
{int arr[10] = {0};int *p = arr;int i = 0;for(i=0; i<=20; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}
👍指针指向空间释放:
int* test()
{int num = 15;return # //出了函数,这块内存就不属于我们了,还给了系统
}int main()
{int* p = test();*p = 5;return 0;
}
注:变量num为局部变量,生命周期从创建开始到出test函数结束,test函数调用结束后num会将空间还给操作系统,此时回到主函数p的地址已经被释放,此时p就是野指针。
3.2如何规避野指针
👍 指针初始化
👍 小心指针越界
👍 指针指向空间释放即使置NULL
👍 避免返回局部变量的地址
👍 指针使用之前检查有效性
4.指针和数组
👍 指针就是指针,指针变量就是一个变量,存放的地址,指针变量的大小是4/8
👍 数组就是数组,可以存放一组数,数组的大小是取决于元素的类型和个数
👍 数组的数组名是数组首元素的地址,地址是可以访问指针变量中
通过指针和数组的关系,可以利用指针的解引用访问数组的元素,不使用数组的下标。
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d ", *(p + i));}return 0;
}
//输出:1 2 3 4 5 6 7 8 9 10
5.二级指针
指针变量也是变量,是变量就有地址,所以指针变量也可以被指针存储,这个是二级指针。
int main()
{int a = 10;int* pa = &a; //pa就是指针变量,一级指针变量,表示指针指向的a是intint* *ppa = &pa; //ppa就二级指针,表示pp指向的p的类型是int*return 0;
}
同样,也可以通过解引用的方式对其访问。
int b = 20;
*ppa = &b;//等价于 pa = &b;
**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a
**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;
6.指针数组
👍指针数组是指针还是数组?
答案:是数组。是存放指针的数组。
👍可以利用指针数组来用一维数组模拟二维数组
int main()
{//用一维数组模拟一个二维数组int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };int arr4[] = { 4,5,6,7,8 };int* arr[4] = {arr1, arr2, arr3, arr4}; //用指针数组管理一维数组int i = 0;for (i = 0; i < 4; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
感谢你看到了这里,以上就是我对C语言指针入门的基本概括,文中不足和需要需要改善的地方望得到指点!感激不尽!!!
相关文章:

【C语言】入门——指针
目录 编辑 1.指针是什么 2.指针类型和指针运算 2.1指针-整数 2.2指针-指针 2.3指针的关系运算 3.野指针 3.1野指针成因 👍指针未初始化: 👍指针越界访问: 👍指针指向空间释放: 3.2如何规避野指针 …...

C#_预处理指令
1. 预处理器指令指导编译器在实际编译开始之前对信息进行预处理。 所有的预处理器指令都是以 # 开始。且在一行上,只有空白字符可以出现在预处理器指令之前。预处理器指令不是语句,所以它们不以分号(;)结束。 C# 编译器没有一个单…...

容器命令(docker)
文章目录 前言一、docker容器命令0、准备工作1、新建容器并启动2、退出容器3、列出所有的运行的容器4、删除容器5、启动和停止容器的操作 总结 前言 本文主要介绍docker中与容器相关的一些命令,是对狂神课程的一些总结,作为一个手册帮助博主和使用docke…...

Vue3 ElementPlus el-cascader级联选择器动态加载数据
参考了这位的大佬的写法 element el-cascader动态加载数据 (多级联动,落地实现)_el-cascader 动态加载_林邵晨的博客-CSDN博客 <el-cascader style"width: 300px" :props"address" v-model"addressValue" …...

leetcode分类刷题:栈(Stack)(一、字符串相邻元素删除类型)
1、在leetcode分类刷题:基于数组的双指针(一、基于元素移除的O(1)类型)题目中,采用双指针之快慢指针的算法来解决。 2、字符串相邻元素的删除问题,用栈来进行管理,会非常有效;这种题型排在后面的…...

你还在找淘宝商品信息查询的接口吗?
你还在找淘宝商品信息查询的接口吗?,不用找了,我这有,免费测试 在很多行业,比如淘客、商品采集、刊登、数据分析行业都需要用到相关的商品接口,但是官方一般又没有开放这些接口,怎么办ÿ…...

dll修复精灵,dll修复工具下载方法分享,mfc140u.dll缺失损坏一键修复
今天,我将为大家分享一个关于mfc140u.dll的问题。首先,我想问一下在座的网友们,有多少人知道mfc140u.dll是什么?又有多少人知道它的作用以及如何解决这个问题呢?在接下来的演讲中,我将详细介绍mfc140u.dll的…...

[LINUX使用] iptables tcpdump
iptables: 收到来自 10.10.10.10 的数据后都丢弃 iptables -I INPUT -s 10.10.10.10 -j DROP 直接 reject 来自 10.10.10.* 网段的数据 iptables -I INPUT -s 10.10.10.0/24 -j REJECT tcpdump: dump eth0的数据到本地 tcpdump -i eth0 -w dump.pcap 只抓 目的地址是 10…...

百度文心一率先言向全社会开放 应用商店搜“文心一言”可直接下载
8月31日,文心一言率先向全社会全面开放。广大用户可以在应用商店下载“文心一言APP”或登陆“文心一言官网”(https://yiyan.baidu.com) 体验。同时,企业用户可以直接登录百度智能云千帆大模型平台官网,调用文心一言能…...

【100天精通Python】Day56:Python 数据分析_Pandas数据清洗和处理
目录 数据清洗和处理 1.处理缺失值 1.1 删除缺失值: 1.2 填充缺失值: 1.3 插值: 2 数据类型转换 2.1 数据类型转换 2.2 日期和时间的转换: 2.3 分类数据的转换: 2.4 自定义数据类型的转换: 3 数…...

【vue】使用无障碍工具条(详细)
引入:使用的是太阳湾的无障碍工具条,代码地址:https://gitee.com/tywAmblyopia/ToolsUI 具体步骤:下载代码后,将其中的 canyou 文件夹拖入 vue 项目中的 public 文件夹中; 上图是在项目目录中的样子&#…...

java实现命令模式
命令模式是一种行为设计模式,它允许您将请求封装为对象,以便您可以将其参数化、队列化、记录和撤销。在 Java 中实现命令模式涉及创建一个命令接口,具体命令类,以及一个接收者类,该接收者类执行实际操作。下面是一个简…...

【PowerQuery】PowerQuery学习路径
PowerQuery这么好,怎么去学习呢?相信很多初读本书的朋友迫切的希望了解整个PowerQuery全景知识和它提供的相应的功能。但是对于PowerQuery来说,一开始就会进行自定义函数的构建当然也是不可能的,这里有相应的学习路径来进行由浅入深的学习,帮助读者更好的理解PowerQuery的…...
JDK7多线程并发环境HashMap死循环infinite loop,CPU拉满100%,Java
JDK7多线程并发环境HashMap死循环infinite loop,CPU拉满100%,Java HashMap底层数据实现是数组链表,链表在哈希碰撞后装入新数据,像是一个桶。 HashMap在JDK7的实现中,并发环境存在死循环infinite loop问题。导致的结果…...

Linux下的系统编程——认识进程(七)
前言: 程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括 代码段(text section) 和 数据段(data section), 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等等.下面让我们开始对Linux进程有个…...

2023年9月CSPM-3国标项目管理中级认证报名,找弘博创新
CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要…...

使用ChatGLMTokenizer处理json格式数据
我下载了一些中文wikipedia数据,准备采用ChatGLMTokenizer对齐进行清洗,整理为预训练语料。 import numpy as np import json from tqdm import tqdm from chatglm_tokenizer.tokenization_chatglm import ChatGLMTokenizertokenizer ChatGLMTokenizer…...

Redis基础特性及应用练习-php
redis持久化(persistence) redis支持两种方式的持久化,可以单独使用或者结合起来使用。 第一种:RDB方式(redis默认的持久化方式) rdb方式的持久化是通过快照完成的,当符合一定条件时redis会自…...

Numpy知识点回顾与学习
Numpy知识点回顾与学习 什么是Numpy? Numpy使用Python进行科学计算的基础包。因为机器学习当中很多都会用到数组、线性代数等知识,经常需要和数组打交道,所以Numpy学习成为了科研之路上必须掌握的一门技能。Numpy包含以下的内容:…...

H.264视频编码推荐的分辨率和码率配置表
Video Encoding Settings for H.264 Excellence 针对H.264编码格式,根据不同分辨率,推荐其对应的码率配置关系如下图所示: 如下为上限,超过这个上限再增加码率基本无太大意义!根据业务场景、帧率,建议码率…...

Greenplum 实用工具-gpaddmirrors
注:本文翻译自https://docs.vmware.com/en/VMware-Greenplum/7/greenplum-database/utility_guide-ref-gpaddmirrors.html gpaddmirrors工具用于向未配置镜像的Greenplum数据库系统添加镜像segment。 语法 gpaddmirrors [-p <port_offset>] [-m <datadi…...

详解 Cent OS JDK 8.0 安装配置
环境配置 云服务器云耀云服务器L操作系统CentOS 7.9 64bit | 公共镜像JDK版本64 bit JDK 1.8 下载地址 JDK官网下载地址Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads/#java8百度网盘 ARM64 链接:https://pan.baidu.com/s/1wQ1mp…...

代理IP与网络安全在跨境电商中的关键作用
跨境电商已成为全球商业的重要组成部分,然而,随之而来的网络安全问题也日益凸显。为了在海外市场取得成功,不仅需要优质的商品和服务,还需要稳定、安全的网络连接。本文将介绍如何运用Socks5代理IP技术解决这些挑战。 1. 代理IP与…...

Kafka3.0.0版本——消费者(消费方式)
目录 一、Kafka 消费方式1.1、pull(拉) 模式1.2、push (推)模式1.3、Kafka采用pull(拉) 模式缺点 一、Kafka 消费方式 1.1、pull(拉) 模式 consumer采用从broker中主动拉取数据。K…...

uni-app rich-text组件富文本图片展示不全问题
背景:phpfastadmin富文本插件上传富文本内容到数据库,uni-app渲染富文本内容。这里后端不需要特殊处理。uni-app的rich-text组件展示图片跑板。直接贴代码。 <template><view><title-bar title"会员动态" back backcolor"…...

文件包含漏洞学习小结
目录 一、介绍 二、常见文件包含函数 三、文件包含漏洞代码举例分析 四、文件包含漏洞利用方式 4.1 本地文件包含 1、读取敏感文件 2、文件包含可运行的php代码 ①包含图片码 ②包含日志文件 ③包含环境变量getshell ④临时文件包含 ⑤伪协议 4.2 远程文件包含 4.…...

同时安装python2和3解决方案
我先安装python3后,按照网上步骤,继续安装好python2,直接运行python -v只能显示python2,运行python3找不到此命令,通过https://blog.csdn.net/qq_64409509/article/details/131514944这篇文章找到了解决方案࿰…...

通过jr-qrcode生成二维码并下载到客户端本地(Vue)
生成二维码 首先生成二维码图片的地址 引入jr-qrcode import jrQrcode from jr-qrcode; 生成二维码图片的地址 // 生成二维码地址 getQRCodeUrl(spreadUrl) {const QRCodeUrl jrQrcode.getQrBase64(spreadUrl);return QRCodeUrl; }that.backUrl jrQrcode.getQrBase64(da…...

命令执行漏洞(附例题)
一.原理 应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。 二.利用条…...

iOS开发Swift-类型转换
1.Int或Double转字符串 let x 20 let y "\(x)" let z String(x)2.Double转Int(去掉小数点后面的) Int(1.9)3.Int转Double Double(1)4.向上转型 class A{//A父类 }class B: A{//B子类继承A }let a A() let b B()b as A //子类转化成父类5.向下转型 class A{//A…...