C语言从入门到精通第17天(指针和数组联用)

news2024/9/29 13:26:10

指针和数组联用

  • 不同类型指针变量之间的区别
  • 数组的指针
  • 指针数组

不同类型指针变量之间的区别

在了解数组和指针联用之前,我们先对指针变量进行补充。我们对比一下int *p1和char *p2的区别?

相同点:

  • 都是指针变量
  • 都是用来保存一个内存地址编号
  • 占用的内存空间大小一样
int main(){
    int a = 10;
    char b = 'e';
    int *p1 = &a;
    char *p2 = &b;

    // 输出指针变量所指向值的内容
    printf("%d %c\n",*p1,*p2);

    // 输出指针变量所占空间大小
    printf("%d %d\n",sizeof(p1),sizeof(p2));  // 8 8

    // 输出指针变量所指向空间的大小
    printf("%d %d\n",sizeof(*p1),sizeof(*p2));  // 4 1
}

注意: 这里指针变量再32位机器上占用的内存空间是4个节,再64位机器上占用的空间是8个节。这是因为指针变量保存的是一个内存地址的编号,32位机器内存地址编号最大值为 2 32 − 1 2^{32}-1 2321,可以用4个字节的变量保存。而在64位机器内存地址编号最大值为 2 64 − 1 2^{64}-1 2641,可以用8个字节的变量保存。

不同点:

  • int *p1的作用就是指针变量p1将他所指向的内存空间中的二进制当作int类型进行处理。
  • char *p2的作用就是指针变量p2将他所指向的内存空间中的二进制当作char类型来处理。

p1++和p2++的区别,我们来看以下代码:

int main(){
    int a = 10;
    char b = 'e';
    int *p1 = &a;
    char *p2 = &b;

    printf("%p %p\n%p %p",p1,p2,p1++,p2++);
    return 0;
}

p1自增后输出的地址比开始多了4个字节,p2自增后输出的地址比开始多了1个字节,即当指针变量进行自增的时候,偏移的是一个数据类型,而并非一个字节。

数组的指针

一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,他们都有相应的地址。所谓的数组的指针是指数组的起始地址。即数组名表示数组的首地址,因此数组名也是一种指针。在前面我们知道了数组可以通过下标进行访问。而当指针进行自增操作时,偏移的是数据类型的个数,所以这里我们还可以通过【数组名+偏移量】进行数组中元素的访问。

语法:

*(数组名+偏移量)

  • 这里的偏移量指的访问元素的位置。
  • 数组名加偏移量实际上是一个地址,然后通过指针运算符*将其地址中的内容进行取出。

在这里插入图片描述

代码如下:

int main(){
    int ch[] = {1,2,23,33,3,3,5};

    // 使用下标进行访问数组的第三个元素
    printf("%d\n",ch[2]);  //23

    // 使用偏移量访问数组的第三个元素
    printf("%d\n",*(ch+2));  //23

    return 0;
}

指针数组

指针数组就是存放指针的数组,本质是数组,数组中的每个元素都是指针

语法:

数据类型 *数组

  • 数据类型支持所有的数据类型。
  • 数组中的所有元素都是指针类型,即地址

在这里插入图片描述

数组中保存了几个整型常量的地址(需要注意的是这里保存的是地址而并不是整型常量)。

代码如下:

int main(){
    int a = 10,b = 12,c = 13;
    int *ch[3];

    // 给指针数组进行初始化
    ch[0] = &a;
    ch[1] = &b;
    ch[2] = &c;

    // 因为ch[0] = &a,则对&a 进行指针运算符则相当于对数组进行操作
    // 所以想得到a的内容需使用 *ch[0]

    printf("b is%d\n",*ch[1]);
    return 0;
}

注意: int *ch[3]等价于(int *)ch[3];因为[]*的优先级要高先与ch进行匹配。所以这里就可以将他理解为他是一个int *类型的数组。

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

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

相关文章

中级软件设计师备考---软件工程1

目录 经典的模型敏捷开发方法【的分类】信息系统开发方法【的分类】结构化设计---内聚与耦合结构化设计---系统结构/模块结构 需求的分类 经典的模型 瀑布模型:最早的一类、适用于需求明确的项目、结构化的典型代表 原型模型:先构造一个建议的系统原型再…

数据治理服务及数据治理应用解决方案

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 一、数据治理概述 (一) 数据治理概念 数据治理是指将数据作为组织资产围绕数据全生命周期而展开的相关管控活动、绩效和风险管理工作的集合,以保障数据及其应用…

Nmap入门到高级【第十章】

预计更新Nmap基础知识 1.1 Nmap简介和历史 1.2 Nmap安装和使用方法 1.3 Nmap扫描技术和扫描选项 Nmap扫描技术 2.1 端口扫描技术 2.2 操作系统检测技术 2.3 服务和应用程序检测技术 2.4 漏洞检测技术 Nmap扫描选项 3.1 扫描类型选项 3.2 过滤器选项 3.3 探测选项 3.4 输出选项…

中间件漏洞(二)nginx解析漏洞

目录 1.漏洞原理分析 2. 利用条件 3. 漏洞复现 1.漏洞原理分析 Nginx的解析漏洞的出现和Nginx的版本没有关系,漏洞的产生是由于php配置问题导致的。 2. 利用条件 # php.ini cgi.fix_pathinfo1 # php-fpm.conf security.limit_extensions 分别解释一下cgi.fix_…

Sentinel --- 隔离和降级、授权规则、规则持久化

一、隔离和降级 限流是一种预防措施,虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了…

HTTP加密

文章目录 原理方式证书 原理 HTTP HTTPS TLS/SSL(数据的加密解密层) HTTP是应用层的协议,当应用层向下访问的时候并不是直接访问到socket层,而是先通过TLS/SSL加密解密层后再进行后续工作。此时得到的协议就是HTTPS。 举个例…

【五一创作】排序篇:冒泡排序,快速排序的递归与非递归实现(C语言)

目录 前言: 一:冒泡排序 基础思路 完整排序 时间复杂度分析 二:递归实现快速排序 基础思路 单趟排序 (1)双向扫描法 (2)挖坑法 (3)前后指针法(推荐这种) 完整排序 时间复杂度分析 优化 (1)三数取中 (2)小区间优化 三&#xf…

基于Vue3+TS+Vite+Cesium创建项目

基于Vue3TSViteCesium创建项目 基于Vite构建项目安装配置Cesium创建Cesium三维视图运行结果 随着近几年社会的发展,人们对三维可视化的需求也是越来越多,三维GIS如今真的越来越火了,对于做GIS前端开发的人员来说,Cesium开发是绝对…

PLC模糊PID(模糊规则表)

模糊PID的模糊化相关内容,请参看下面的博客文章: PLC模糊控制模糊PID(梯形图实现+算法分析)_RXXW_Dor的博客-CSDN博客博途PLC的模糊PID控制详细内容请查看下面的博客文章:Matlab仿真+博途PLC模糊PID控制完整SCL源代码参考(带模糊和普通PID切换功能)_博途怎么实现模糊pid_…

linux驱动开发 - 08_内核定时器

文章目录 1 Linux 时间管理和内核定时器简介1.1 内核时间管理简介1.2 内核定时器简介1、init_timer 函数2、add_timer 函数3、del_timer 函数4、del_timer_sync 函数5、mod_timer 函数 1.3 Linux 内核短延时函数 2 实验程序编写2.1 定时器驱动程序编写2.2 编写测试 APP 3 编译驱…

【Linux】管道

目录 一、前言 二、管道 1、匿名管道 1.1、基本原理 1.2、代码实现 1.3、管道的特点 1.4、基于管道的简单设计 2、命名管道 2.1、匿名管道与命名管道的区别 2.2、代码实现命名管道通信 一、前言 为了满足各种需求,进程之间是需要通信的。进程间通信的主要目…

【VM服务管家】专题_7.5 异常收集

目录 5.1 信息收集:异常报错信息收集的方法5.2 日志等级:日志等级调低的方法 5.1 信息收集:异常报错信息收集的方法 描述 环境:VM4.0以上VS2013及以上 现象:未知问题、偶发问题、崩溃问题如何收集信息提供给研发排查。…

【Linux】基础IO——库函数与系统调用的关系

目录 引言1.文件操作语言方案(C的文件操作接口-库函数)打开文件、关闭文件——fopen、fclose打开文件的模式 写入——fput、printf读取——fgets 2.文件操作系统方案(系统的文件操作接口-系统调用)打开文件、关闭文件——open、cl…

【游戏逆向】Lua游戏逆向及破解方法介绍

前言 随着手游的发展,越来越多的Cocos-lua端游开发者转移到手游平台。Lua脚本编写逻辑的手游也是越来越多,如梦幻西游、刀塔传奇、开心消消乐、游龙英雄、奇迹暖暖、疾风猎人、万万没想到等手游。随着Lua手游的增加,其安全性更值得关注&…

python基本数据类型---数字字符串

引入 在内存中存储的数据可以是不同的数据类型。比如名字可以使用字符串存储,年龄可以使用数字存储,python有6种基本数据类型,用于各种数据的存储,分别是:numbers(数字类型)、string(字符串)、List(列表)、Tuple(元组…

哈希表企业应用-DNA的字符串检测

DNA的字符串检测-引言 若干年后, ikun DNA 检测部成立,专门对 这些ikun的解析检测 突然发现已经完全控制不了 因为学生已经会了 而且是太会了 所以DNA采用 以下视频测试: ikun必进曲 ikun必经曲 ikun必阶曲 如何感受到了吧!,如果你现在唱跳并且还Rap 还有打篮球 还有铁山靠 那…

自动化运维工具Ansible之playbooks剧本

目录 一、playbooks 1、playbooks简述 2、playbooks剧本格式 3、playbooks组成部分 4、playbooks启动及检测 5、playbooks模块实战实例1 6、vars模块实战实例2 7、when模块实战实例3 8、with_items循环模块实战实例4 9、template模块实战实例5 10、tags模块实战实例…

有研究员公开了一个解析并提取 Dell PFS BIOS 固件的工具(上)

导语:研究员公开了一个解析并提取 Dell PFS BIOS 固件的工具。 Dell PFS BIOS提取器 介绍 解析 Dell PFS BIOS 映像并提取其 SPI/BIOS/UEFI 固件组件。它支持所有Dell PFS 修订版和格式,包括最初在 ThinOS 包中LZMA压缩、ZLIB压缩或拆分成块的格式。输出…

Vue 注册组件介绍

Vue组件的基本概念 Vue组件是一种可复用的Vue实例,用于封装可重用的HTML元素、JavaScript代码和CSS样式。它可以让开发者更好地组织和复用代码,使Web应用程序更加可维护和可扩展 Vue组件通常由三部分组成:模板(template&#xf…

NLP实战:快递单信息抽取-基于ERNIE1.0 预训练模型

目录 一、介绍 二、代码 2.1前期准备 2.2加载自定义数据集 2.3数据处理 2.4数据读入 2.5PaddleNLP一键加载预训练模型 2.6设置Fine-Tune优化策略,模型配置 2.7模型训练与评估 ​编辑 2.8模型预测 三、总结 原文: 一、介绍 命名实体识别&…