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);        // 输出 100printf("*p1 = %d\n", *p1);    // 输出 100printf("**p2 = %d\n", **p2);  // 输出 100printf("***p3 = %d\n", ***p3);// 输出 100return 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.140000free(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.mzph.cn/diannao/24918.shtml

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

相关文章

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

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

数学模型:操作系统中FCFS、SJF、HRRN算法的平均周转时间比较 c语言

摘 要 研究目的&#xff1a;比较操作系统中进程调度FCFS、SJF、HRRN算法的平均周转时间和带权周转时间的大小关系。 研究方法&#xff1a;在建模分析时&#xff0c;分别举4个进程的例子&#xff0c;1个进程用两个字母分别表示到达时间和执行时间。分两种极端情况&#xff0c…

iOS18:借助 Al,Siri 将获得广泛的知识,以便触发各个应用的功能

iOS18:借助 Al&#xff0c;Siri 将获得广泛的知识&#xff0c;以触发各个应用的功能 预计Siri将成为iOS18中一系列与人工智能相关增强功能的核心。 根据彭博社记者马克古尔曼的一份新报告&#xff0c;可以得知关于苹果智能助手的一些具体升级的新信息。 Siri新的人工智能: …

经典回归模型及Python实现方法

文章目录 1. 引言2. 经典回归模型及Python实现2.1 线性回归 Linear Regression2.2 多项式回归 Polynomial Regression2.3 逻辑回归 Logistic Regression2.4 岭回归 Ridge Regression2.5 套索回归 LASSO Regression2.6 弹性网络回归 Elastic Net2.7 决策树回归 Decision Tree Re…

Linux GNOME 桌面系统音频设置实现

在 Ubuntu 等使用了 GNOME 桌面系统的 Linux 系统中&#xff0c;通过 设置 应用的 声音 面板设置系统的音频相关配置&#xff0c;如下图&#xff1a; 音频设置可以设置的音频选项主要有如下这些&#xff1a; 系统音量&#xff1a;默认不允许将音量提高到 100% 以上&#xff0c…

Java异常机制

1.异常概述和异常处理机制 异常(exception)概述 异常就是程序在运行时出现的意外的&#xff0c;不正常的情况。 若异常产生后没有正确的处理&#xff0c;会导致程序的中断&#xff0c;程序不继续执行,以致造成损失。 2.2 异常处理机制 所以我们在开发中要一套机制来处理各种可能…

计算机网络 —— 网络层(子网掩码和子网划分)

计算机网络 —— 网络层&#xff08;子网掩码和子网划分&#xff09; 网络地址转换NAT子网掩码和子网划分举个例子第一步&#xff1a;看类型第二步&#xff1a;从主机号开始比对第三步&#xff1a;去头去尾 我们今天来看子网掩码和子网划分&#xff1a; 网络地址转换NAT 网络…

用于认知负荷评估的集成时空深度聚类(ISTDC)

Integrated Spatio-Temporal Deep Clustering (ISTDC) for cognitive workload assessment 摘要&#xff1a; 本文提出了一种新型的集成时空深度聚类&#xff08;ISTDC&#xff09;模型&#xff0c;用于评估认知负荷。该模型首先利用深度表示学习&#xff08;DRL&#xff09;…

人工智能在【肿瘤生物标志物】领域的最新研究进展|顶刊速递·24-06-08

小罗碎碎念 本期文献速递的主题是——人工智能在“肿瘤生物标志物”领域的最新研究进展。 重点关注 今天推荐的6篇文献中&#xff0c;第二篇和第三篇是小罗最喜欢的&#xff0c;因为对于临床来说&#xff0c;比较具有实际意义&#xff0c;也和自己的想法很契合。 尤其是第三篇…

每日一题——Python实现PAT甲级1015 Reversible Primes(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 is_prime函数分析&#xff1a; decimal_to_base函数分析&#xff1a; 主循…

Shell脚本学习_环境变量深入

目录 1.Shell环境变量深入&#xff1a;自定义系统环境变量 2.Shell环境变量深入&#xff1a;加载流程原理介绍 3.Shell环境变量深入&#xff1a;加载流程测试 4.Shell环境变量深入&#xff1a;识别与切换Shell环境类型 1.Shell环境变量深入&#xff1a;自定义系统环境变量 …

旧衣回收小程序开发,轻松回收旧衣物

随着环保理念的增强&#xff0c;回收市场得到了快速发展&#xff0c;吸引了不少年轻人进入到市场中创业。除了传统的废品回收外&#xff0c;旧衣回收也受到了大众的重视&#xff0c;市场规模迅速扩大&#xff0c;大众浪费的衣物也获得了归处。 目前旧衣回收的方式主要是线上与…

makefile与进度条

Linux项目自动化构建工具-make/makefile make是一个命令&#xff0c; makefile是一个文件&#xff0c;保存依赖关系和依赖方法。‘ touch Makefile/makefile mybin:mytest.c//依赖关系 目标文件&#xff1a;依赖文件列表 文件列表的文件之间以空格分隔 gcc -o mybin mytest.…

Shell脚本学习_字符串变量

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

linux系统——ping命令

ping命令可以用来判断对远端ip的连通性&#xff0c;可以加域名也可以加公共ip地址 这里发送出56字节&#xff0c;返回64字节

ctfshow-web入门-命令执行(web41_exp与分析)

过滤不严&#xff0c;命令执行 preg_match(/[0-9]|[a-z]|\^|\|\~|\$|\[|\]|\{|\}|\&|\-/i, $c) 过滤掉了数字、字母以及一些符号&#xff0c;之前接触过的无字母 rce 是取反编码再取反&#xff0c;采用不可见字符去绕过正则&#xff0c;但是这里取反符号被过滤掉了&#x…

Kali linux学习入门

Kali linux学习入门 文章目录 Kali linux学习入门Kali Linux简介Kali Linux工具篇Kali Docker安装Docker 更换国内镜像源Kali 安装 docker compose Kali Linux文档篇Kali Linux 社区篇 Kali Linux简介 Kali Linux是专门用于渗透测试linux操作系统&#xff0c;它由BackTrack发展…

软件游戏找不到d3dx9_43.dll怎么办,三分钟教你解决此问题

在现代科技发展的时代&#xff0c;电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们可能会遇到一些问题&#xff0c;其中之一就是电脑缺失d3dx943.dll文件。这个问题可能会影响到我们的正常使用&#xff0c;因此了解其原因和解决方…

接口(API)开发,测试工具-apifox

前言 为什么需要接口&#xff08;API&#xff09;? 因为不同的平台或系统可能使用不同的技术栈、编程语言或数据格式。API提供了一个标准化的方式&#xff0c;使得这些不同的系统可以相互交换数据和功能调用&#xff0c;实现互操作性 在开发日常的项目交互中&#xff0c;不…

PyCharm中 Fitten Code插件的使用说明一

一. 简介 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手&#xff0c;它可以自动生成代码&#xff0c;提升开发效率&#xff0c;帮您调试 Bug&#xff0c;节省您的时间&#xff0c;另外还可以对话聊天&#xff0c;解决您编程碰到的问题。 前一篇文章学习了 PyCharm…