【c语言】指针小结

一、指针是什么?

可以通过运算符&来取得变量实际保存的 起始地址

(这个地址是虚拟地址,并不是真正物理内存上的地址。)

数据类型 *标识符 = &变量;

int *pa = &a; int *pa = NULL;

(NULL表示地址为0的内存空间,这个地址是无法使用的,读写该地址会报错)

pa 中存储的就是变量 a 的地址,也叫做指向 a 的指针。

int *a,b; 等价于 int *a;int b;而不等价于 int *a; int *b;

💡 变量的初始化!int *pa;
声明指针变量之后,编译器会为指针变量本身分配一个内存空间,但是这个内存空间里面的值是随机的,也就是说, 未初始化的指针变量指向的地址是随机的。 这时一定不能去读写指针变量指向的地址,因为那个地址是随机地址,很可能会导致严重后果。

  • 错误案例:*p = 1; 错误的,p指向的内存是随机的,不可以赋值
  • 正确案例: p = &a; *p = 1 正确的,此时p指向a的地址,可以为a赋值

💡 pa中存储的是a变量的内存地址,那如何通过地址去获取a的值呢?
这个操作就叫做解引用 比如*pa就能获得a的值。

二、指针的运算

指针仅在同一段内存中比较才有意义。指针本质上就是一个无符号整数,代表了内存地址。它可以进行运算,但是规则并不是整数运算的规则。

  1. 指针与整数值的加减运算
    指针与整数值的运算,表示指针的移动。

    int* i;
    i = (int *)0x0034;
    i = i + 1; // 0x0038
    

    i是一个指针,指向内存地址0x0034, 不要误认为i + 1等于0x0035,正确答案是0x0038(也就是sizeof(int)的大小 )。

    原因是i + 1表示指针向内存地址的高位移动一个单位,而一个单位的short类型占据两个字节的宽度,所以相当于向高位移动两个字节。

    同样的,i - 1得到的结果是0x0032。指针移动的单位,与指针指向的数据类型有关。数据类型占据多少个字节,每单位就移动多少个字节。

  2. 指针与指针的加法运算

    两个指针进行加法是非法的。

  3. 指针与指针的减法
    相同类型的指针允许进行减法运算,返回它们之间的距离,即相隔多少个数据单位。
    高位地址减去低位地址,返回的是正值;低位地址减去高位地址,返回的是负值。
    这时,减法返回的值属于ptrdiff_t类型,这是一个带符号的整数类型别名,具体类型根据系统不同而不同。这个类型的原型定义在头文件stddef.h里面。

    int* i1;
    int* i2;i1 = (int *)0x0034;
    i2 = (int *)0x0038; // i2 与 i1之间相差4个字节,就是一个int的距离ptrdiff_t dist = i2 - i1;
    printf("%td\n", dist);  // 1
    
  4. 指针与指针的比较运算
    指针之间的比较运算,比较的是各自的内存地址哪一个更大,返回值是整数1(true)或0(false)。

三、多级指针

这里的 03 号格子就叫二级指针,05 号格子就叫指针,而 07 号就是我们平常用的变量。

不管几级指针有两个最核心的东西:

  • 指针本身也是一个变量,需要内存去存储,指针也有自己的地址
  • 指针内存存储的是它所指向变量的地址

这就是我为什么多级指针是逻辑上的概念,实际上一块内存要么放实际内容,要么放其它变量地址,就这么简单。

怎么去解读int **a这种表达呢?

int **a 可以把它分为两部分看,即int**a,后面 *a 中的*表示 a 是一个指针变量,前面的 int* 表示指针变量a

只能存放 int* 型变量的地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/600810.shtml

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

相关文章

Apache SeaTunnel:探索下一代高性能分布式数据集成工具

大家下午好,我叫刘广东,然后是来自Apache SeaTunnel社区的一名Committer。今天给大家分享的议题是下一代高性能分布式海量数据集成工具,后面的整个的PPT,主要是基于开发者的视角去看待Apache SeaTunnel。后续所有的讲解主要是可能…

52、Flink的应用程序参数处理-ParameterTool介绍及使用示例

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的…

LeetCode第102题 - 二叉树的层序遍历

题目 解答 class Solution {List<List<Integer>> nodeLevels new ArrayList<>();public List<List<Integer>> levelOrder(TreeNode root) {levelOrder(root, 0);return nodeLevels;}public void levelOrder(TreeNode root, int k) {if (root …

噬菌体序列分析工具PhaVa的使用和使用方法

github: 25280841/PhaVa: Adapting the phasefinder approach for identifying phase variation to long reads (github.com) 挺简单的&#xff0c;这里就不翻译了&#xff0c;大家看着直接用吧。 PhaVa PhaVa is an approach for finding potentially Phase Variable invert…

第7章-第1节-Java中的异常处理

1、异常Exception概述&#xff1a; 1&#xff09;、异常的概念&#xff1a; 现实生活中万物在发展和变化会出现各种各样不正常的现象。 例如&#xff1a;人的成长过程中会生病。 实际工作中&#xff0c;遇到的情况不可能是非常完美的。 比如&#xff1a;你写的某个模块&…

使用jmeter从0开始完成性能测试

使用JMeter从0开始完成性能测试 介绍 在软件开发过程中&#xff0c;性能测试是一项关键任务&#xff0c;它可以帮助我们评估系统在不同负载条件下的性能表现&#xff0c;发现潜在的性能瓶颈。JMeter是一款功能强大且易于使用的性能测试工具&#xff0c;它可以帮助我们完成各种…

欧洲最好的AI大模型:Mistral 7B!(开源、全面超越Llama 2)

你可能已经听说过Meta&#xff08;原Facebook&#xff09;的Llama 2&#xff0c;这是一款拥有13亿参数的语言模型&#xff0c;能够生成文本、代码、图像等多种内容。 但是你知道吗&#xff0c;有一家法国的创业公司Mistral AI&#xff0c;推出了一款只有7.3亿参数的语言模型&am…

GitHub Copilot 最佳免费平替:阿里通义灵码

之前分享了不少关于 GitHub Copilot 的文章&#xff0c;不少粉丝都评论让我试试阿里的通义灵码&#xff0c;这让我对通义灵码有了不少的兴趣。 今天&#xff0c;阿七就带大家了解一下阿里的通义灵码&#xff0c;我们按照之前 GitHub Copilot 的顺序分享通义灵码在相同场景下的…

Vue 之 修饰符汇总

一、简介 在Vue中&#xff0c;修饰符是一种特殊的语法&#xff0c;用于修改指令或事件绑定的行为&#xff0c;它们以点号&#xff08;.&#xff09;的形式添加到指令或事件的后面&#xff0c;并可以改变其默认行为或添加额外的功能&#xff0c;如&#xff1a;禁止事件冒泡、数…

java 中数组常用排序方法举例说明

java 中数组常用排序方法举例说明 在Java中&#xff0c;数组的排序是常见的操作之一&#xff0c;而Java提供了多种排序方法来满足不同场景的需求。下面详细介绍5种常用的数组排序方法&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a; 冒泡排序是一种简单…

【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data

问题&#xff1a;【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data 解决方案&#xff1a; 1.在示例中修改showDraw()方法的data数据&#xff0c;实现以下环状面效果 2.示例链接&#xff1a; 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 export f…

Ubuntu20.04安装ROS2 Foxy

Ubuntu20.04安装ROS2 Foxy 实操安装 安装ROS2的教程在网上很多&#xff0c;但是我操作之后都有问题&#xff0c;大部分的问题是在 sudo apt update 时访问packages.ros.org无法成功&#xff0c;主要的原因是没有外网&#xff0c;而自己整一个外网代理又非常麻烦&#xff0c;所…

读书之深入理解ffmpeg_简单笔记3(初步)

通读完只能对书中内容有大概的了解&#xff0c;具体的细节还得一一实践攻克。 10: libavformat接口使用 媒体流&#xff0c;文件等封装&#xff0c;解封装&#xff0c;转封装 视频截取&#xff0c;AVFormatContext,AVPacket等介绍 11&#xff1a;libavcodec接口使用 视频&…

Android开发中“真正”的仓库模式

原文地址&#xff1a;https://proandroiddev.com/the-real-repository-pattern-in-android-efba8662b754原文发表日期&#xff1a;2019.9.5作者&#xff1a;Denis Brandi翻译&#xff1a;tommwq翻译日期&#xff1a;2024.1.3 Figure 1: 仓库模式 多年来我见过很多仓库模式的实…

pytest安装失败,报错Could not find a version that satisfies the requirement pytest

问题 安装pytest失败&#xff0c;尝试使用的命令有 pip install pytest pip3 install pytest pip install -U pytest pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple但是都会报同样的错&#xff1a; 解决方案 发现可能是挂了梯子的原因&#xff0c;关掉…

代码随想录算法训练营Day20|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

目录 654.最大二叉树 前言 递归法 617.合并二叉树 前言 递归法 700.二叉搜索树中的搜索 前言 递归法 递归法 98.验证二叉搜索树 前言 递归法 迭代法 总结 654.最大二叉树 题目链接 文章链接 前言 本题延续昨天最后一题&#xff0c;依然是一道构造二叉树的题目…

烟花燃放如何管控?智能分析网关V4烟火检测保障烟火安全

一、方案背景 随着元旦佳节的热潮退去&#xff0c;春节也即将来临&#xff0c;在众多传统的中国节日里&#xff0c;烟花与烧纸祭祀都是必不可少的&#xff0c;一方面表达了人们对节日的庆祝的期许&#xff0c;另一方面也是一种对故者思念的寄托。烟花爆竹的燃放不仅存在着巨大的…

Node.js中的模块,常用模块具体代码示例

核心模块&#xff1a;https://blog.csdn.net/kkkys_kkk/article/details/135409851?spm1001.2014.3001.5501 目录 第三方模块 代码示例 Express示例 Lodash示例 MongoDB示例 Async示例 Request示例 发送GET 发送POST请求 自定义模块 创建步骤 常见示例 导出一个函数&a…

【PHP】TP5 使用模型一对一关联查询,条件筛选及字段过滤

目录 方法一&#xff1a;使用Eloquent ORM的with关联查询 方法二&#xff1a;使用JOIN进行查询 方法一&#xff1a;使用Eloquent ORM的with关联查询 在 ThinkPHP5 中&#xff0c;可以使用模型关联和条件查询来实现一对一关联查询。以下是一个示例&#xff1a; 假设有两个表&a…

跑通大模型领域的 hello world

跑通书生浦语大模型的 3 个趣味 demo&#xff08;InternLM-Chat-7B 智能对话、Lagent工具调用解简单数学题、浦语灵笔多模态图文创作和理解&#xff09;视频和文档。 1、两个框架 InternLM 是⼀个开源的轻量级训练框架&#xff0c;旨在⽀持⼤模型训练⽽⽆需⼤量的依赖。 Lage…