10-指针进阶——char型,多级指针,void指针,const指针

news2024/11/26 0:29:10

10-指针进阶——char型,多级指针,void指针,const指针

文章目录

  • 10-指针进阶——char型,多级指针,void指针,const指针
    • 一、char 型指针
      • 1.1 示例
    • 二、多级指针
      • 2.1 示例
    • 三、 指针的万能拆解方法
      • 3.1 示例
    • 四、void 型指针
      • 4.1 示例
      • 4.2 void 关键字的作用
        • 4.2.1 示例
    • 五、const 指针
      • 5.1 常指针
      • 5.2 常目标指针

一、char 型指针

概念:字符指针(char*)是一种特殊类型的指针,用来指向一个字符或字符数组,通常用于字符串处理。

1.1 示例

#include <stdio.h>

int main() {
    char *msg = "Hello Even";
    printf("%s\n", msg); // 输出字符串 "Hello Even"
    return 0;
}

在上述代码中,msg是一个字符指针,指向字符串常量 "Hello Even" 的首字符 'H'

二、多级指针

概念:多级指针是指针的指针。一个指针指向另一个指针时,就是多级指针。

  • 一级指针:指向一个普通变量的地址。
  • 二级指针:指向一个指针变量的地址。
  • 三级指针:指向一个二级指针变量的地址。

2.1 示例

#include <stdio.h>

int main() {
    int a = 100;
    int *p1 = &a;    // 一级指针
    int **p2 = &p1;  // 二级指针
    int ***p3 = &p2; // 三级指针

    printf("a = %d\n", a);        // 输出 100
    printf("*p1 = %d\n", *p1);    // 输出 100
    printf("**p2 = %d\n", **p2);  // 输出 100
    printf("***p3 = %d\n", ***p3);// 输出 100

    return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这段代码中,p1 是一个一级指针,指向变量 ap2 是一个二级指针,指向 p1p3 是一个三级指针,指向 p2

三、 指针的万能拆解方法

每个指针都可以分为两部分:

  1. 第一部分:说明它是一个指针(*p)。
  2. 第二部分:说明它所指向的内容的类型(*p 以外的东西)。

3.1 示例

#include <stdio.h>

int main() {
    char *p1;               // 第一部分: *p1,第二部分: char, 说明 p1 指向 char 类型
    char **p2;              // 第一部分: *p2,第二部分: char *, 说明 p2 指向 char* 类型
    int **p3;               // 第一部分: *p3,第二部分: int *, 说明 p3 指向 int* 类型
    char (*p4)[3];          // 第一部分: *p4,第二部分: char[3], 说明 p4 指向一个拥有3个元素的 char 数组
    char (*p5)(int, float); // 第一部分: *p5, 第二部分: char(int, float), 说明 p5 指向一个返回 char 并需要 int 和 float 参数的函数
    void *(*p6)(void *);    // 第一部分: *p6, 第二部分: void *(void *), 说明 p6 指向一个返回 void* 并需要 void* 参数的函数

    return 0;
}

在这个例子中:

  • p1 是一个指向 char 类型的指针。
  • p2 是一个指向 char* 类型的指针,即指向 char 指针的指针。
  • p3 是一个指向 int* 类型的指针,即指向 int 指针的指针。
  • p4 是一个指向拥有 3 个 char 元素的数组的指针。
  • p5 是一个指向一个返回 char 类型并需要 intfloat 参数的函数的指针。
  • p6 是一个指向一个返回 void* 并需要 void* 参数的函数的指针。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结

  • char 型指针:用于指向字符或字符串数组,常用于字符串处理。
  • 多级指针:指针的指针,可以是一级、二级、三级等多级指针,用于更复杂的内存操作。
  • 指针的万能拆解方法:可以将任何指针分解为两部分,一部分表示它是一个指针,另一部分表示它所指向的内容的类型。

指针的大小是固定的(在64位系统中为8字节),但它们所指向的数据类型各不相同

四、void 型指针

概念void 型指针表示该指针的类型暂时不确定,即它可以指向任何类型的数据

要点

  1. 无法直接索引目标void 型指针必须先进行强制类型转换,然后才能索引目标。
  2. 无法直接进行加减运算void 型指针不允许直接进行加减运算,因为编译器不知道如何移动指针。

4.1 示例

#include <stdio.h>
#include <stdlib.h>

int main() {
    void *p = malloc(4); // 使用 malloc 申请 4 个字节的内存,并让 p 指向该内存的入口地址

    *(int *)p = 250; // 强制类型转换为 int 型指针,然后解引用
    printf("*p as int: %d\n", *(int *)p); // 输出 250

    *(float *)p = 3.14; // 强制类型转换为 float 型指针,然后解引用
    printf("*p as float: %f\n", *(float *)p); // 输出 3.140000

    free(p); // 释放内存
    return 0;
}

在上面的代码中,p 是一个 void 型指针,通过强制类型转换为 int 型指针或 float 型指针来访问数据。

注意
以上写法 void * p , 在实际开发中不应该出现。以上代码只是为了说明语法问题。

4.2 void 关键字的作用

  1. 修饰指针:表示该指针指向了一个未知类型的数据。
  2. 修饰函数的参数列表:表示该函数不需要参数。
  3. 修饰函数的返回值:表示该函数没有返回值。
4.2.1 示例
void functionWithNoReturnValue(void) {
    // 函数没有返回值,也不需要参数
}

int main() {
    functionWithNoReturnValue();
    return 0;
}

五、const 指针

概念const 修饰指针有两种效果:

  1. 常指针:修饰的是指针本身,表示该指针变量无法修改
  2. 常目标指针:修饰的是指针所指向的目标,表示无法通过该指针来改变目标的数据

5.1 常指针

#include <stdio.h>

int main() {
    char arr[] = "Hello";
    char msg[] = "Even";
    char * const p = arr;

    // p = msg; // 编译错误:p 被 const 修饰,表示 p 是一个常量,无法修改它的内容(所指向的地址)

    *(p + 1) = 'E'; // p 所指向的内容是可以通过 p 来修改的
    printf("%s\n", p); // 输出 "HEllo"

    return 0;
}

5.2 常目标指针

#include <stdio.h>

int main() {
    char arr[] = "Hello";
    char msg[] = "Even";
    const char *p1 = arr;//常目标指针

    p1 = msg; // p1 的指向是可以被修改的

    // *(p1 + 1) = 'V'; // 编译错误:常目标指针不允许通过该指针来修改它所指向的内容

    *(msg + 1) = 'V'; // 直接修改内容是可以的
    printf("%s\n", p1); // 输出 "Even"

    return 0;
}

总结:

  • void 型指针:通用指针,可以指向任意类型的数据,但需要强制类型转换后才能操作。
  • const 修饰指针
    • 常指针:指针本身不能修改(指向的地址不能变),但所指向的内容可以修改。
    • 常目标指针:所指向的内容不能通过该指针修改,但指针本身可以指向其他地址。

在实际开发中,const 修饰符经常用于限制指针的权限,特别是常目标指针,用来确保数据的只读性,防止误修改。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

相关文章

并查集进阶版

过关代码如下 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> #include<unordered_set> using namespace std;int n, m; vector<int> edg[400005]; int a[400005], be[400005]; // a的作用就是存放要摧毁 int k; int fa[400005]; int daan[400005]…

Qt OPC UA初体验

介绍 OPC UA全称Open Platform Unified Architecture&#xff0c;开放平台统一架构&#xff0c;是工业自动化领域通用的数据交换协议&#xff0c;它有两套主要的通信机制&#xff1a;1.客户端-服务器通信&#xff1b;2.发布订阅。Qt对OPC UA通信标准也提供了支持&#xff0c;目…

分享一个 .NET Core Console 项目使用依赖注入的详细例子

前言 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种软件设计模式&#xff0c;主要用于管理和组织一个软件系统中不同模块之间的依赖关系。 在依赖注入中&#xff0c;依赖项&#xff08;也称为组件或服务&#xff09;不是在代码内部创建或查…

移动端投屏到大屏幕的操作详解

如果你懒得折腾电脑、电视或其他大屏设备上的影视软件安装及配置&#xff0c;可以选择直接在手机端上将影片投屏到电脑、电视或其他大屏设备上&#xff0c;这里给大家分享三种手机投屏的方法。 系统自带的投屏功能 不管是安卓、鸿蒙还是苹果操作系统&#xff0c;都自带了无线…

HTML静态网页成品作业(HTML+CSS)—— 24节气立夏介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

最小相位系统

最小相位系统 1、传递函数 一个线性系统的响应。 比如一个RC低通滤波器&#xff1a; 交流分量在电容的充放电中被滤除掉&#xff0c;通过设置电容器的电容值&#xff0c;以及电阻值&#xff0c;能够控制这种滤除能力&#xff0c;这个参数为RC。 电容的电抗为 1 / j w C 1/j…

变声器软件免费版有哪些?国内外12大热门变声器大盘点!(新)

变声软件是一种人工智能AI音频处理工具&#xff0c;允许用户实时修改自己的声音或改变预先录制的音频。这些软件解决方案可提供不同的效果&#xff0c;如改变声音的音调或速度&#xff0c;或将我们的声音转换成其他人或其他东西的声音&#xff0c;如名人、卡通人物、机器人或不…

力扣96 不同的二叉搜索树 Java版本

文章目录 题目描述代码 题目描述 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5 示例 2&#xff1a; 输入…

澳大利亚和德国媒体投放-国外新闻发稿-海外软文推广

德国媒体 Firmenpresse德国新闻 Firmenpresse德国新闻是一家备受欢迎的新闻发布平台&#xff0c;其好友搜索引擎在收录网站方面表现出色。如果您希望更好地将您的新闻传播给德国受众&#xff0c;Firmenpresse德国新闻将是一个理想的选择。 Frankfurt Stadtanzeiger法兰克福城…

三维重建 虚拟内窥镜(VE)是什么?怎么实现 使用场景

1.虚拟内窥镜&#xff1a; 就是利用计算机图形学、虚拟现实、图像处理和科学可视化等信息处理技术仿真光学内窥镜对病人进行诊断的一种技术。 VE(Virtual Endoscopy)&#xff0c;虚拟内镜技术。这种CT重建图像可以模拟各种内镜检查的效果&#xff0c;它是假设视线位于所要观察…

RaspAP:轻松实现树莓派无线 AP

RaspAP 是一个可以将树莓派轻松部署成无线 AP&#xff08;Access Point&#xff09;的软件方案&#xff0c;具有一套响应式的 WebUI 来控制 WiFi&#xff0c;用起来和家用路由器一样方便。RaspAP 可以运行在 Raspbian 上&#xff0c;只需要先给树莓派安装好 Raspbian 系统&…

白话解读网络爬虫

网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网络蜘蛛、网络机器人或网络蠕虫&#xff0c;是一种自动化程序或脚本&#xff0c;被用来浏览互联网并收集信息。网络爬虫的主要功能是在互联网上自动地浏览网页、抓取内容并将其存储在本地或远程服务器上供后续处…

备战十一届大唐杯国赛预选赛

这次省赛带了太多个省一了&#xff0c;具体可看下面的图片&#xff0c;只放了一部分。目前根据可靠消息&#xff0c;应该还有个预选赛和去年一样&#xff0c;就是还会考一次仿真。如果说通过了就是国二起步然后去北方工业争夺国一国二&#xff0c;没过的话就是国三。 每…

利用GPT和PlantUML快速生成UML图用于设计

在软件开发中&#xff0c;设计阶段可是关键的一步。UML&#xff08;统一建模语言&#xff09;图能帮我们更清晰地理解和规划系统结构&#xff0c;但手动画UML图有时会很费时费力。好消息是&#xff0c;通过结合使用ChatGPT和PlantUML&#xff0c;我们可以高效地生成UML图&#…

最新下载:Hype 4 mac版【软件附加安装教程】

【简介】 Hype是一款强大的Mac OS平台 HTML5 创作工具&#xff0c;它可以在网页上做出赏心悦目的动画效果&#xff0c;创建丰富的网页交互动画&#xff0c;支持层、时间轴等编辑方式&#xff0c;并能很好的导出HTML5/CSS3/JavaScript&#xff0c;在台式机&#xff0c;智能手机…

进口电动低温调节阀的作用-美国NOTON

进口电动低温调节阀在低温环境下的精确控制、广泛的工业应用、高效能设计、耐低温性和密封性、稳定性及可靠性以及安全性等方面发挥着重要作用。 进口电动低温调节阀的作用主要体现在以下几个方面&#xff1a; 低温环境下的精确控制&#xff1a; 进口电动低温调节阀是一种专为…

2024 年最新 Python 基于百度智能云实现短语音识别详细教程

百度智能云语音识别 采用国际领先的流式端到端语音语言一体化建模算法&#xff0c;将语音快速准确识别为文字&#xff0c;支持手机应用语音交互、语音内容分析、机器人对话等场景。百度短语音识别可以将 60 秒以下的音频识别为文字。适用于语音对话、语音控制、语音输入等场景…

Shell以及Shell编程

Shell的任务 ①分析命令&#xff1b; ②处理通配符、变量替换、命令替换、重定向、管道和作业控制&#xff1b; ③搜索命令并执行。 内部命令&#xff1a;内嵌在Shell中。 外部命令&#xff1a;存在于磁盘上的独立可执行文件。 #&#xff01;/bin/bash #! 称为一个幻数&…

微信小程序毕业设计-综合文化信息管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

【开源】医院电子病历管理系统 SSM+JSP+MySQL

目录 一、项目介绍 科室模块 医生模块 预约挂号模块 就诊记录模块 就诊评价模块 二、项目界面 三、核心代码 一、项目介绍 经典老框架SSM打造入门项目《医院电子病历管理系统》&#xff0c;分为用户网页和管理后台&#xff0c;包括科室模块、医生模块、预约挂号模块、…