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

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 修饰符经常用于限制指针的权限,特别是常目标指针,用来确保数据的只读性,防止误修改。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMakeLists如何多行注释

在使用Visual Studio编写CMakeLists的时候你可能会遇到需要多行注释的情况&#xff0c;可又不知道快捷键是什么。。。 其实你只需要敲个 #[[ 就行了&#xff0c;另外一般方括号VS会自动帮你补全&#xff0c;之后将需要注释的内容放在第二个方括号与第三个方括号之间就完成注释…

Nvidia Jetson/Orin/算能 +FPGA+AI大算力边缘计算盒子:潍柴雷沃智慧农业无人驾驶

潍柴雷沃智慧农业科技股份有限公司&#xff0c;是潍柴集团重要的战略业务单元&#xff0c;旗下收获机械、拖拉机等业务连续多年保持行业领先&#xff0c;是国内少数可以为现代农业提供全程机械化整体解决方案的品牌之一。潍柴集团完成对潍柴雷沃智慧农业战略重组后&#xff0c;…

翻译《The Old New Thing》- Why isn’t there a SendThreadMessage function?

Why isnt there a SendThreadMessage function? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081223-00/?p19743 Raymond Chen 2008年12月23日 为什么没有 SendThreadMessage 函数&#xff1f; 简要 文章讨论了 Windows 中不存在 Sen…

全链路性能测试:Nginx 负载均衡的性能分析和调优

为什么性能测试很多同学觉得是一个比较难以自学上岸的测试领域,是因为真正做全链路的性能测试是比较难的。所谓的全链路就是在项目的整个链路上任何一环节都有可能存在性能测试瓶颈,我们都需要能够通过分析性能的监控指标找到对应的问题。 我们今天要讲的Nginx负载均衡就是…

Shell脚本学习_字符串变量

目录 1.Shell字符串变量&#xff1a;格式介绍 2.Shell字符串变量&#xff1a;拼接 3.Shell字符串变量&#xff1a;字符串截取 4.Shell索引数组变量&#xff1a;定义-获取-拼接-删除 1.Shell字符串变量&#xff1a;格式介绍 1、目标&#xff1a; 能够使用字符串的三种方式 …

【NI国产替代】500 MSPS 采样率,14 bit 分辨率数据采集盒子

• 双高速高精度数据采集通道 • 支持内外精准触发采样模式 • 丰富的总线控制接口 • 抗干扰能力强 高速采集盒子是一款双通道&#xff0c;具有 500 MSPS 采样率&#xff0c;14 bit 分辨率的高速高精度数据采集设备&#xff0c;其模拟输入带宽为 200 MHz&#xff0c;…

深入了解反射

newInstance 可访问性限制&#xff1a; newInstance()方法只能调用无参的公共构造函数。如果类没有无参公共构造函数&#xff0c;那么newInstance()方法将无法使用。 异常处理&#xff1a; newInstance()方法在创建对象时会抛出受检异常InstantiationException和IllegalAcces…

各品牌电视安装第三方软件失败的解决方法

在安装电视第三方软件时&#xff0c;您可能会遇到安装失败、解析错误或无法识别文件类型等问题。以下是一些常见问题的解决方案&#xff0c;小武给您整理了详细的步骤来帮助解决这些问题。 手机投屏或安装方法参考如下文章&#xff1a; 移动端投屏到大屏幕的操作详解 通过U盘…

SpringBoot图书管理系统【附:资料➕文档】

前言&#xff1a;我是源码分享交流Coding&#xff0c;专注JavaVue领域&#xff0c;专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享&#xff0c;定制和毕业设计服务&#xff01; 免费获取方式--->>文章末尾处&#xff01; 项目介绍048&#xff1a; 图…

2024年6月8日 每周新增游戏

中医百科中药: 中医百科中药是一款非常强大的中药知识科普软件&#xff0c;该应用提供500多味中草药的文献资料&#xff0c;强大的搜索功能可根据功效、特点和关键词来快速查找中药&#xff0c;而且每味中药的图片、功效、主治、炮制方法等百科知识&#xff0c;可以很好的帮助你…

计算机专业本科论文起稿咋写

举例基于SpringBoot的Java基础的旅游管理系统 摘要 随着旅游业的快速发展&#xff0c;传统的旅游管理方式已经难以满足现代企业的需求。为了提高旅游企业的管理水平和服务质量&#xff0c;本文设计并实现了一个基于SpringBoot框架的旅游管理系统。本文首先介绍了旅游管理系统的…

E: 仓库 “http://download...graphics:/darktable/xUbuntu_22.04 InRelease” 没有数字签名

问题 Ubuntu22.04装了darktable软件没装好&#xff0c;已经卸载了但是没卸载干净,终端使用 sudo apt update 出现的问题&#xff1a; 解决&#xff1a; sudo nano /etc/apt/sources.list.d/*darktable*.list找到了该软件的相关仓库条目&#xff1a;直接给他注释掉就行了。

springcloud第4季 springcloud-gateway网关filter案例场景

一 filter作用 1.1 filter搭建流程 1.1.1 网关配置 1.1.2 服务提供者 1.1.3 测试验证 1.启动consul 2.启动zipkin 3.启动应用微服务 4.进行访问&#xff1a; http://localhost:6666/pay/wg/filter 1.2 其他常见API RemoveRequestHeadersec-fetch-site # 删除请求…

重构大学数学基础_week04_从点积理解傅里叶变换

这周我们来看一下傅里叶变换。傅里叶变换是一种在数学和许多科学领域中广泛应用的分析方法&#xff0c;它允许我们将信号或函数从其原始域&#xff08;通常是时间域或空间域&#xff09;转换到频域表示。在频域中&#xff0c;信号被表示为其组成频率的幅度和相位&#xff0c;这…

电脑下载速度很慢怎么解决 电脑下载加速工具测评推荐

电脑下载速度慢&#xff0c;不仅耗时冗长&#xff0c;还会影响工作和学习效率。漫长的等待让人心情焦虑&#xff0c;每一秒都是对耐心的极大考验。有关电脑下载速度很慢怎么解决&#xff0c;电脑下载加速工具评测推荐的问题&#xff0c;本文将进行详细介绍。 一、电脑下载速度…

一个简单的消息队列

目录 原理 实现代码 示例 原理 消息队列是一个先进先出栈&#xff0c;每次都处理第一项&#xff0c;处理完了过后会删除这个消息&#xff0c;这是一个简单的消息队列图&#xff1a; 实现代码 首先消息队列需要一个队列&#xff0c;我们用Python里的列表&#xff1a; self.…

信息学奥赛初赛天天练-23-CSP-J2023基础题-指针、链表、哈夫曼树与哈夫曼编码的实战应用与技巧大揭秘

PDF文档公众号回复关键字:20240608 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 4 假设有一个链表的节点定义如下&#xff1a; struct Node {int data; Node* next; };现在有一个指向链表头部…

今年618,京东和爱奇艺为大屏品质“把关”

今年618电视大战&#xff0c;还是打响了。 根据京东618数据显示&#xff0c;618开门红阶段热卖TOP10电视均为75英寸以上的大屏&#xff0c;拥有超高画质的MiniLED电视成交量同比增长5倍。可以看到&#xff0c;大屏电视逐步成为消费主流&#xff0c;尤其是拥有出色视听体验的高…

【MYSQL系列】mysql中text,longtext,mediumtext区别

【MYSQL系列】mysql中text,longtext,mediumtext区别 在MySQL数据库中&#xff0c;TEXT、LONGTEXT和MEDIUMTEXT都是用于存储大量文本数据的字段类型。它们之间的主要区别在于可存储的数据大小和性能方面的差异。本文将探讨这些字段类型的特点、使用场景和一些最佳实践。 TEXT类…

How To: Localize Bar and Ribbon Skin Items

您可以使用Localizer对象自定义皮肤菜单&#xff0c;而不是迭代每个条形皮肤子菜单项和功能区皮肤库项容器来手动修改这些项。此方法允许您同时自定义所有现有栏子菜单和功能区库中的外观项目。 创建BarLocalizer类的派生类并重写XtraLocalizer.GetLocalizedString方法。 pub…