【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针

目录

前言

七、指针

7.1 指针与变量

7.1.1 指针类型和指针变量

7.1.2 指针所指变量

7.1.3 空指针、无效指针

7.2 指针操作

7.2.1 指针的算术运算

7.2.2 指针的比较

7.2.3 指针的递增和递减

7.3 指向指针的指针


前言

  • 指针是C语言中一个重要的概念
  • 正确灵活运用指针
    • 可有效地表示和使用复杂的数据结构
    • 可动态分配内存空间,节省程序运行空间,提高运行效率
  • 不正确理解和使用指针,指针将是程序中最危险的成分,由此带来的后果可能是无法估量的

七、指针

7.1 指针与变量

7.1.1 指针类型和指针变量

        指针类型指定了指针所指向的变量的数据类型。例如,int*是指向整数(int)类型的指针。指针变量是一个存储了内存地址值的变量,可以使用指针变量来存储、操作和访问内存中的数据。

#include <stdio.h>int main() {int num = 10; // 定义一个整数变量int* ptr; // 定义一个指向整数的指针变量ptr = &num; // 将指针指向num变量的地址printf("num 的值:%d\n", num);printf("指针所指向的变量的值:%d\n", *ptr);return 0;
}

  • C语言中的指针定义符是*,它用于声明一个指针变量。指针变量用来存储内存地址,可以指向其他变量或数据结构。例如,int *ptr;声明了一个指向整数的指针变量。
  • 间接引用运算符也称为解引用运算符,用于访问指针所指向的变量或数据。在C语言中,间接引用运算符使用*符号。通过将间接引用运算符应用于指针变量,可以获取该指针指向的实际值。例如,如果ptr是一个指向整数的指针变量,那么*ptr将给出该指针指向的整数的值。

7.1.2 指针所指变量

        通过指针,我们可以访问指针所指向的变量。使用解引用运算符(*)可以获取指针所指向的变量的值。

#include <stdio.h>int main() {int num = 10;int* ptr = &num;printf("通过指针访问变量的值:%d\n", *ptr);*ptr = 20; // 修改指针所指向的变量的值printf("修改后的变量的值:%d\n", num);return 0;
}

7.1.3 空指针、无效指针

        空指针是指未指向任何有效地址的指针。在C语言中,可以使用NULL宏来表示空指针。

#include <stdio.h>int main() {int* ptr = NULL; // 声明一个空指针if (ptr == NULL) {printf("指针是空指针\n");} else {printf("指针不是空指针\n");}return 0;
}

  •  有时可能不小心生成无效指针 (Invalid  Pointer)
    • 无效指针是指一个指针变量无值,它既没有指向确定的变量或函数,也不是NULL。
    • 程序中存在无效指针,不是好的程序设计风格
    • 产生无效指针的原因很多,例如
      • 说明指针变量后还没有给它赋值
      • 指针被定义后,必须将指针和一个特定的变量进行关联后,才可以使用指针,即必须先赋值再使用
      • 把整型变量转换成指针;
      • 回收为指针所指对象分配存储空间;
        • float *p; 
          p=(float *)malloc(sizeof(float));
          ……
          free(p);

      • 指针运算超出数组范围。
  • NULL是C指针类型的一个特殊值,在系统文件stdio.h中定义,其值为0,称为“空”
  • 表示指针变量的值为空,不指向任何变量或函数
  • NULL值属于所有指针类型。判断指针变量iptr的值是否为空可以使用
    • iptr != NULL或iptr == NULL
      iptr != 0
  • 保证指针在没有指向有效对象时,取值为NULL是一种良好的编程风格

7.2 指针操作

        指针操作是指对指针进行一些特定的运算或操作,用于操作指针所指向的内存位置。在C语言中,指针操作包括指针的算术运算、指针的比较和指针的递增/递减等。

7.2.1 指针的算术运算

  • 指针的加法运算:可以将指针与一个整数相加,结果是指针指向的内存地址增加了若干个字节。这对于遍历数组或访问连续内存块非常有用。
  • 指针的减法运算:可以将一个指针减去另一个指针,结果是两个指针之间的距离(以字节为单位)。
#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int* ptr = arr;printf("第一个元素:%d\n", *ptr);// 指针加法运算ptr = ptr + 1;printf("第二个元素:%d\n", *ptr);// 指针减法运算ptr = ptr - 1;printf("回到第一个元素:%d\n", *ptr);return 0;
}

7.2.2 指针的比较

        可以对两个指针进行比较运算,包括相等比较(==)、不等比较(!=)、大于比较(>)、小于比较(<)、大于等于比较(>=)和小于等于比较(<=)。

#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int* ptr1 = &arr[0];int* ptr2 = &arr[2];if (ptr1 == ptr2) {printf("指针相等\n");} else {printf("指针不相等\n");}if (ptr1 < ptr2) {printf("ptr1 指向的元素在 ptr2 指向的元素之前\n");} else {printf("ptr1 指向的元素在 ptr2 指向的元素之后\n");}return 0;
}

7.2.3 指针的递增和递减

        指针可以通过递增(++)和递减(--)运算符来移动到下一个或上一个内存位置,移动的距离取决于指针所指向的数据类型。

#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int* ptr = arr;printf("第一个元素:%d\n", *ptr);// 指针递增ptr++;printf("下一个元素:%d\n", *ptr);// 指针递减ptr--;printf("回到第一个元素:%d\n", *ptr);return 0;
}

7.3 指向指针的指针

        C语言支持指向指针的指针,也称为多级指针。指向指针的指针存储了一个指向指针变量的地址,通过多级指针可以访问多级间接引用的内存。

#include <stdio.h>int main() {int num = 10;int* ptr = &num;int** ptr2 = &ptr;printf("num 的值:%d\n", num);printf("指针所指向的变量的值:%d\n", *ptr);printf("指向指针的指针所指向的变量的值:%d\n", **ptr2);return 0;
}

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

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

相关文章

Android原生实现控件圆角方案(API28及以上)

Android控件的圆角效果的实现方式有很多种&#xff0c;这里介绍一下另一种Android原生的圆角实现方案&#xff08;API28及以上&#xff09;。 我们利用ShapeAppearanceModel、MaterialShapeDrawable来实现一个圆角/切角的Button。 实现效果如下图 我们在为控件添加阴影的基础上…

波奇学C++:用红黑树模拟实现map和set

用同一个树的类模板封装map(key/value)和set(key) 红黑树的Node template<class T> struct RBTreeNode {RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeNode<T>* _parent;T _data;Colour _col;RBTreeNode(const T& data):_left(nullptr),_r…

kafka日志文件详解及生产常见问题总结

一、kafka的log日志梳理 日志文件是kafka根目录下的config/server.properties文件&#xff0c;配置log.dirs/usr/local/kafka/kafka-logs&#xff0c;kafka一部分数据包含当前Broker节点的消息数据(在Kafka中称为Log日志)&#xff0c;称为无状态数据&#xff0c;另外一部分存在…

选择适合建筑公司的企业网盘平台

随着城市化进程的加速&#xff0c;越来越多的人开始关注乡村生活品质。Z公司以其标准化产品和优质资源整合&#xff0c;为回乡建房人群提供了一种全新的、高品质的整体解决方案。 Z公司深入调研了10W的回乡建房人群需求&#xff0c;组建了设计、工艺、供应链方面的专家团队&…

【Gradle-10】不可忽视的构建分析

1、前言 构建性能对于生产力至关重要。 随着项目越来越复杂&#xff0c;花费在构建上的时间就越长&#xff0c;开发效率就越低。 通过分析构建过程&#xff0c;可以了解项目构建的时间都花在哪&#xff0c;以及项目存在哪些潜在的问题&#xff0c;找到构建瓶颈&#xff0c;解…

顺序表的简单介绍

目录 前提须知&#xff1a; 数据结构&#xff1a; 什么是数据结构&#xff1f; 数据结构特点&#xff1a; 为什么需要数据结构&#xff1a; 顺序表&#xff1a; 线性表&#xff1a; 与数组区别&#xff1a; 静态顺序表与动态顺序表&#xff1a; 二者之间的区别&#x…

高通camx开源部分简介

camera整体框架 ISP Pipeline diagram Simple Model Camx and chi_cdk 整体框架 CtsVerifier, Camra Formats Topology of Camera Formats. Topology (USECASE: UsecaseVideo) Nodes List Links between nodes Pipeline PreviewVideo Buffer manager Create Destro…

定制自己的 Excel 界面 + 保存 Excel

文章目录 Excel 的界面自定义快速访问工具栏自定义功能区折叠或显示功能区自定义 Excel 的界面保存 Excel Excel 的界面 快速访问工具栏也可以放在功能区下方&#xff1a; 效果&#xff1a; 自定义快速访问工具栏 方法一&#xff1a; S1&#xff1a; S2&#xff1a; 方法二…

(c语言)经典bug

#include<stdio.h> //经典bug int main() { int i 0; int arr[10] {1,2,3,4,5,6,7,8,9,10}; for (i 0; i < 12; i) //越界访问 { arr[i] 0; printf("hehe\n"); } return 0; } 注&#xff1a;输出结果为死循…

geecg-uniapp 源码下载运行 修改端口号 修改tabBar 修改展示数据

APP体验&#xff1a; http://jeecg.com/appIndex技术官网&#xff1a; http://www.jeecg.com安装文档&#xff1a; 快速开始 JeecgBoot 开发文档 看云视频教程&#xff1a; 零基础入门视频官方支持&#xff1a; http://jeecg.com/doc/help 一&#xff0c;下载安装 源码下载…

信创之国产浪潮电脑+统信UOS操作系统体验3:使用 visual studio code搭建Python开发环境

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 老猿原来在windows下开发python程序&#xff0c;要么使用python自带的IDLE&#xff0c;要么使用pycharm&#xff0c;IDLE用来开发很不方便&#xff0c;而pycharm对开发支持比较好&#xff0c;换成…

Angular学习笔记:路由

本文是自己的学习笔记&#xff0c;主要参考资料如下。 - B站《Angular全套实战教程》&#xff0c;达内官方账号制作&#xff0c;https://www.bilibili.com/video/BV1i741157Fj?https://www.bilibili.com/video/BV1R54y1J75g/?p32&vd_sourceab2511a81f5c634b6416d4cc1067…

【Java】微服务——Nacos配置管理(统一配置管理热更新配置共享Nacos集群搭建)

目录 1.统一配置管理1.1.在nacos中添加配置文件1.2.从微服务拉取配置1.3总结 2.配置热更新2.1.方式一2.2.方式二2.3总结 3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&#xff0c;使用不同的pr…

大数据概述(林子雨慕课课程)

文章目录 1. 大数据概述1.1 大数据概念和影响1.2 大数据的应用1.3 大数据的关键技术1.4 大数据与云计算和物联网的关系云计算物联网 1. 大数据概述 大数据的四大特点&#xff1a;大量化、快速化、多样化、价值密度低 1.1 大数据概念和影响 大数据摩尔定律 大数据由结构化和非…

Observability:使用 OpenTelemetry 对 Node.js 应用程序进行自动检测

作者&#xff1a;Bahubali Shetti DevOps 和 SRE 团队正在改变软件开发的流程。 DevOps 工程师专注于高效的软件应用程序和服务交付&#xff0c;而 SRE 团队是确保可靠性、可扩展性和性能的关键。 这些团队必须依赖全栈可观察性解决方案&#xff0c;使他们能够管理和监控系统&a…

【面试经典150 | 矩阵】旋转图像

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;原地旋转方法二&#xff1a;翻转代替旋转 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带…

Flask实现注册登录模块

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言1.…

几道web题目

总结几道国庆写的web题目 [ACTF2020 新生赛]Include1 点进去发现就一个flag.php,源代码和抓包都没拿到好东西 结合题目猜是文件包含&#xff0c;构建payload ?filephp://filter/readconvert.base64-encode/resourceflag.php 得到base64编码过的flag&#xff0c;解码即可 此题…

Android---Class 对象在执行引擎中的初始化过程

一个 class 文件被加载到内存中的步骤如下图所示&#xff1a; 装载 装载是指 Java 虚拟机查找 .class 文件并生成字节流&#xff0c;然后根据字节流创建 java.lang.Class 对象的过程。 1. ClassLoader 通过一个类的全限定名&#xff08;包名类名&#xff09;来查找 .class 文件…