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

C语言基础——指针

文章目录

  • 一、指针
    • 1.指针的意义
    • 2.指针类型表示
    • 3.一些操作
      • 3.1打印1个变量地址
      • 3.2通过地址查看改地址的内容以及修改改地址的内容
      • 3.3操作某个空间 -- 4个字节,给他赋值为100,只知道该空间的地址0x8000 0000
    • 4.指针变量的定义
    • 5.指针类型的大小
    • 6.指针变量的使用
      • 6.1 指针变量的初始化
      • 6.2一个指针变量对应多个普通变量
      • 6.3想通过指针对某个变量空间操作:
      • 6.4一个变量,多个指针指向该变量
      • 6.5指针类型的强转
    • 7.指针的其他应用
      • 7.1 指针变量+1,物理地址变化
      • 7.2指针与一维数组
        • 7.2.1数组名代表该数组的首地址
        • 7.2.2num和&num[0] -- 指针类型
        • 7.2.3 *num -- 代表
        • 7.2.4 *(p+1)和*p+1的区别
        • 7.2.5 *p++和++*p的区别:
        • 7.2.6扩展:数组名代表该数组的首地址,不能够进行变量++。
      • 7.3数组名和指针名:指针名可以替换数组名
      • 7.4指针与二维数组
        • 7.4.1二维数组的首地址表示
        • 7.4.2上述3种首地址表示方式他们的指针类型分别是:
        • 7.4.3获取第一行首地址
        • 7.4.4二维数组的数组名 -- 数组指针类型
      • 7.5扩展
      • 7.6指针的指针--二级指针

一、指针

指针就是地址。

1.指针的意义

地址:数据的位置。
指针是C语言提供的一种类型。

2.指针类型表示

类型 *
类型:char int float double 指针 结构体 数组
//char * – 代表这个地址里面存放的是char型数据 — 该指针指向一个char型空间
//int * – 代表这个地址里面存放的是int型数据
问题:
在这里插入图片描述
通过强制类型转换:(int *)0x40000000 – C语言代表1个可以存放整型数据的地址
在这里插入图片描述
*地址 – 代表该地址中的内容。
int num = 10;
打印num变量的地址:%p,&num
32位CPU和系统:地址 – 0x0000 0000 ~ 0xffff ffff – 32位
64位CPU和系统:地址 – 64位

3.一些操作

3.1打印1个变量地址

&变量名 – 普通变量。
数组名 – 数组。

3.2通过地址查看改地址的内容以及修改改地址的内容

在这里插入图片描述
操作空间如下图
在这里插入图片描述

3.3操作某个空间 – 4个字节,给他赋值为100,只知道该空间的地址0x8000 0000

*((int *)0x8000 0000) = 100;
//但是操作系统显示段错误,不允许普通用户直接修改地址的空间,基层嵌入式可以

4.指针变量的定义

类型 *标识符; – 没有赋初值,称为野指针变量。
类型 *标识符 = NULL; (习惯)
类型 *标识符 = &变量名;(习惯)

int num = 100;
定义1个指针变量指向该num空间?
int *pnum = #
pnum 代表的是本身变量的空间
*pnum 代表的是指向的空间
在这里插入图片描述

5.指针类型的大小

指针类型的大小–32位/64位
在这里插入图片描述
在这里插入图片描述

6.指针变量的使用

6.1 指针变量的初始化

例如:int num = 0; char ch = 0; char str[1024]=”\0”;
int *pnum = NULL;//NULL – 空 = 0
指针变量在不使用的情况下,一般初始化为NULL,否则我们称该指针为野指针。

6.2一个指针变量对应多个普通变量

//int num1=100,num2=500;
//int pnum = NULL;
//pnum指向num1 – C语言如何编写? pnum = &num1; – 可以通过
pnum 操作num1的空间。
//pnum指向num2 – C语言如何编写? pnum = &num2; – 可以通过*pnum操作num2的空间。
在这里插入图片描述

6.3想通过指针对某个变量空间操作:

1.定义一个指针变量 int pnum = NULL;
2.把某个变量的地址赋值给指针变量 pnum = #
3.通过
指针变量名,就可以操作某个变量空间 *pnum = 1000;

6.4一个变量,多个指针指向该变量

在这里插入图片描述

6.5指针类型的强转

和普通变量一样。(指针类型) 某个变量地址。
unsigned int num = 0x12345678;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.指针的其他应用

7.1 指针变量+1,物理地址变化

指针变量+1,物理地址+类型大小。

7.2指针与一维数组

7.2.1数组名代表该数组的首地址

打印数组的首地址
在这里插入图片描述
在这里插入图片描述

7.2.2num和&num[0] – 指针类型

一样:num – 整型*
num[0] – 整型*

7.2.3 *num – 代表

– 数组中第0个元素的空间 num[0]

7.2.4 (p+1)和p+1的区别

          *(p+1) 代表:地址+1 -- num[1] 

在这里插入图片描述
p+1 = num[0]+1 = 11 – -因为优先级 > + 先执行*p,再执行+1

例1:
打印:int num[5]={10,8,6,4,2};num的内容,通过地址打印
在这里插入图片描述
例2:
打印:int num[5]={10,8,6,4,2};num的内容,通过指针变量打印
在这里插入图片描述

7.2.5 *p++和++*p的区别:

原因:++和的优先级相同,从右到左执行。
先执行++,再执行
p,地址+1(下面例子)
在这里插入图片描述
先执行*p,再++,内容+1
在这里插入图片描述

7.2.6扩展:数组名代表该数组的首地址,不能够进行变量++。

7.3数组名和指针名:指针名可以替换数组名

在这里插入图片描述
在这里插入图片描述

7.4指针与二维数组

指针变量与二维数组的元素之间的关系:
在这里插入图片描述

7.4.1二维数组的首地址表示

在这里插入图片描述
在这里插入图片描述

7.4.2上述3种首地址表示方式他们的指针类型分别是:

&num[0][0] – int * – 整型指针类型 – 第0行0列元素的地址 = int *
num – int (*)[4] – 整型数组指针类型
num[0] – int * – 整型指针类型 – 第0行的首地址 = int *
在这里插入图片描述

7.4.3获取第一行首地址

获取第1行的首地址:
&num[1][0]
也可以:num[1]
在这里插入图片描述
结果:num[0] num[1] num[2] – 代表了3个一维数组

在这里插入图片描述
在这里插入图片描述

7.4.4二维数组的数组名 – 数组指针类型

在这里插入图片描述
在这里插入图片描述

7.5扩展

数组指针 – 代表是指针 – 用于二维数组中。
指针数组 – 代表是数组 – 指针类型的数组
在这里插入图片描述

7.6指针的指针–二级指针

获取一个指针变量的地址?
&变量名;
定义1个指针变量,保存另外一个指针变量的地址。 — 二级指针

p – 本身变量空间
*p – 指向的空间
*(地址) – 对该地址进行寻址

相关文章:

C语言基础——指针

文章目录一、指针1.指针的意义2.指针类型表示3.一些操作3.1打印1个变量地址3.2通过地址查看改地址的内容以及修改改地址的内容3.3操作某个空间 -- 4个字节,给他赋值为100,只知道该空间的地址0x8000 00004.指针变量的定义5.指针类型的大小6.指针变量的使用6.1 指针变…...

反序列化渗透与攻防(二)之Java反序列化漏洞

Java反序列化漏洞 反序列化漏洞 JAVA反序列化漏洞到底是如何产生的? 1、由于很多站点或者RMI仓库等接口处存在java的反序列化功能,于是攻击者可以通过构造特定的恶意对象序列化后的流,让目标反序列化,从而达到自己的恶意预期行为,包括命令执行,甚至 getshell 等等。 …...

优先级队列的模拟实现(仿函数)

目录: 1.priority_queue接口的实现(先建大堆) 1.push 加 向上调整的实现 2.pop 3.迭代器区间的构造 2.仿函数 3.仿函数优化我们的优先级队列 -------------------------------------------------------------------------------------------…...

Python pandas和numpy用法参考(转)

以下是转载:Python pandas用法 - 简书介绍 在Python中,pandas是基于NumPy数组构建的,使数据预处理、清洗、分析工作变得更快更简单。pandas是专门为处理表格和混杂数据设计的,而NumPy更适合处...https://www.jianshu.com/p/840ba1…...

mysql数据库的在线数据备份与数据恢复

MySQL是一种常用的关系型数据库管理系统,它支持在线备份和恢复数据。在线备份指的是在MySQL数据库运行时备份数据,而不会中断或影响现有的数据库服务。在本文中,我们将介绍MySQL数据库的在线数据备份和恢复的原理和操作步骤。 一、备份原理 …...

Vue3自定义指令之前端水印功能实现

一、前置知识 — Vue 中的自定义指令 先来说说 vue2和vue3中自定义全局指令的区别 相同点:指令的应用场景,原理是一致的; 不同点:生命周期钩子函数名,指令定义的格式不一样。 vue2中自定义全局指令: 定义…...

文章生成器写出来的原创文章

文章生成机器人 文章生成机器人是一种基于人工智能技术和自然语言处理算法的程序,可以自动地生成高质量、原创的文章。 文章生成机器人的优点如下: 提高工作效率:文章生成机器人能够在较短的时间内自动帮助用户生成大量的文章,提…...

2023年全国最新高校辅导员精选真题及答案49

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 76.气质就是我们平常所说的脾气秉性。 答案:正确 77.社会心理通常是通过社会…...

【STL十】关联容器——set容器、multiset容器

【STL十】关联容器——set容器、multiset容器一、set简介二、头文件三、模板类四、set的内部结构五、成员函数1、迭代器2、元素访问3、容量4、修改操作~~5、操作~~5、查找6、查看操作六、demo1、查找find2、修改操作insert3、修改操作erase、clear七、multisetset和multiset会根…...

什么是Node.js

文章目录什么是Node.js简介常用命令Node内置模块Node.js和JavaScript的区别什么是Node.js 简介 Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它允许开发者使用JavaScript编写服务器端代码,而不仅仅是浏览器端的代码。Node.js的出现使得JavaScript可以在…...

比GPT-4 Office还炸裂,阿里版GPT全家桶来袭

疯狂3月的那一天,一切还历历在目。 微软突然在发布会上放出大招,用Microsoft 365 Copilot掀起了办公软件革命。 而今天,阿里也放出一枚重磅炸弹——阿里版的Copilot也要来了! 并且比微软更彻底的是,阿里全系产品也都…...

mysql 建表约束

主键约束 -- 主键约束 -- 使某个字段不重复且不得为空,确保表内所有数据的唯一性。 CREATE TABLE user (id INT PRIMARY KEY,name VARCHAR(20) );-- 联合主键 -- 联合主键中的每个字段都不能为空,并且加起来不能和已设置的联合主键重复。 CREATE TABLE …...

在Vue项目中使用tinymce富文本编辑器

TinyMC编辑器简介 TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。跟其他富文本编辑器相比,有着丰富的插件,支持多种语言,能够满足日常的业务需求并且免费。 TinyMCE的优势: 开源可商用,基于LGPL2.1 插…...

GPT-4 和ChatGPT API的定价分析

OpenAI发布了他们的ChatGPT新机器学习模型GPT-4。GPT-4是GPT-3的一大进步,GPT-3是当前ChatGPT免费版本(GPT 3.5 Turbo)所运行的模型的基础,今天我们也来凑个热点,研究一下它们的定价 GPT-4新的功能 GPT-4可以在对话中使用图像,并…...

基于html+css的盒子展示2

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…...

【持续更新篇】SLAM视觉特征点汇总+ORB特征点+VINS前端

Harris角点 opencv函数 cornerHarris提取输入图像的Harris角点 检测原理 检测思想:使用一个固定窗口在图像上进行任意方向的滑动,对比滑动前后的窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有较大灰度变化&#xf…...

【C语言】初阶指针(指针及其类型以及野指针)

简单不先于复杂,而是在复杂之后。 目录 1. 指针是什么? 2. 指针和指针类型 2.1 指针-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 1. 指针是什么? 指针理解的两个要点: 1. 指针是内存中最小…...

UDS统一诊断服务【六】访问时序参数0X83服务

文章目录前言一、访问时序参数服务介绍二、数据格式2.1 请求报文2.2 子功能2.3 响应三、举例前言 本文介绍UDS统一诊断服务的访问时序参数0X83服务,希望能对你有所帮助 一、访问时序参数服务介绍 这个服务我目前在项目中没怎么用到过,先来看看ISO14229…...

Linux应用编程(文件属性与目录)

本章将会讨论如下主题内容。 ⚫ Linux 系统的文件类型; ⚫ stat 系统调用; ⚫ 文件各种属性介绍:文件属主、访问权限、时间戳; ⚫ 符号链接与硬链接; ⚫ 目录; ⚫ 删除文件与文件重命名。 一、Linux 系统中…...

第十四届蓝桥杯嵌入式详解

目录 第一部分 客观试题(15 分) 不定项选择(1.5 分/题) 第二部分 程序设计试题(85 分) 2.1 STM32CubeMX初始化配置 2.1.1 配置GPIO 2.1.2 配置ADC 2.1.3 配置RCC 2.1.4 配置定时器TIM 2.1.5 配置ADC1、AD…...

别再只会用百度搜了!手把手教你用site语法精准锁定CSDN、知乎等网站的技术文章

技术搜索的艺术:用site语法打造高效信息获取系统 每次打开搜索引擎,输入技术关键词后,铺天盖地的结果中真正有用的内容却寥寥无几——这可能是大多数开发者都经历过的困扰。广告推广、低质量转载、过时教程混杂其中,而真正优质的C…...

Scarab:重构空洞骑士模组管理体验的技术实践

Scarab:重构空洞骑士模组管理体验的技术实践 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 问题溯源:模组管理的隐性成本与技术瓶颈 量化手动管理的效…...

用战神引擎开服后,别忘了这几步:服务器安全、日志监控与性能调优指南

战神引擎开服后的高阶运维指南:安全加固、日志监控与性能调优实战 当你成功用战神引擎架设传奇手游服务器后,真正的挑战才刚刚开始。服务器能跑起来只是第一步,如何让它跑得稳、跑得安全、跑得高效,才是区分普通服主和专业运维的关…...

终极Windows系统清理指南:免费工具让电脑重获新生

终极Windows系统清理指南:免费工具让电脑重获新生 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 您的Windows电脑是否变得越来越慢?C盘空…...

7天掌握Driver Store Explorer:Windows驱动管理的完整指南

7天掌握Driver Store Explorer:Windows驱动管理的完整指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Driver Store Explorer(简称RAPR)是…...

FORK客户端与GitHub高效协作指南

1. 为什么选择FORK客户端与GitHub协作 作为一个常年混迹在代码仓库的老司机,我试过几乎所有主流的Git图形化工具。FORK客户端给我的第一印象就是——清爽。没有复杂的界面,没有多余的功能,就像它的名字一样,专注做好代码分支管理…...

Flutter项目卡在‘assembleDebug’?Gradle配置优化全攻略

1. 为什么Flutter项目会卡在assembleDebug阶段? 这个问题困扰过无数Flutter开发者,尤其是刚入门的新手。当你满怀期待地运行flutter run命令,结果控制台卡在Running Gradle task assembleDebug...一动不动,那种感觉就像等一辆永远…...

解决EF Core中的GroupBy与Include的冲突问题

在使用Entity Framework Core(EF Core)进行数据库操作时,我们常常会遇到一些复杂的查询需求,尤其是在涉及到数据的分组与关联加载时。今天我们来探讨一下如何在EF Core中处理GroupBy与Include方法的冲突。 问题描述 假设我们有一个产品数据库,包含产品(Products)、供应…...

RS232 vs RS485 vs TTL:如何为你的嵌入式项目选择正确的电平标准?

RS232 vs RS485 vs TTL:嵌入式工程师的电平标准选型指南 在嵌入式系统开发中,选择合适的电平标准往往决定了整个通信系统的可靠性和成本效益。就像建筑师需要根据不同的地质条件选择合适的地基方案一样,工程师也需要根据传输距离、环境干扰和…...

为什么JavaScript无法访问用户电脑的硬件信息

JavaScript和硬件信息访问:安全和信任的博弈许多人想知道:为什么JavaScript不能访问用户计算机的硬件信息?答案与安全和信任机制密切相关。虽然本地客户端软件可以访问硬件信息,但这是基于用户对软件的信任和授权。浏览器和客户端…...