当前位置: 首页 > news >正文

C语言进阶之路-指针、数组等混合小boss篇

目录

一、学习目标:

二、指针、数组的组合技能

引言

指针数组

语法

数组指针

三、勇士闯关秘籍

四、大杂脍

总结


一、学习目标:

知识点:

  • 明确指针数组的用法和特点
  • 掌握数组指针的用法和特点
  • 回顾循环等小怪用法和特点

二、指针、数组的组合技能

引言

  • 苹果
  • 苹果
  • 发霉苹果

指针数组

概念: 他是一个数组,该数组存储的多个类型相同的指针。

语法

 int *   arr[ 10 ] ;  // 整形指针数组char *  arr[ 10 ] ; // 字符指针数组float ** arr[10 ] ; // 浮点型的二级指针数组
int a  = 123 ;
int b = 456 ;
int c = 789 ;int * arr[10] = { &a, &b ,&c }; // 定义了一个有10个元素的数组arr ,这10个元素都应该是 int 类型的地址printf("*arr[0]:%d\n" , *arr[0] );// arr === &a的地址 --> *arr  === &a   --> **arr === **&&a === a == 123
printf("**(arr+1):%d\n" , **(arr+1) ); printf("**(arr+2):%d\n" , **(arr+2) ); 

操作练习:

char * s1 = "Even";
char * s2 = "Jacy";
char * s3 = "Yilia";
char * s4 = "TieZhu";char ** arr[4] = { &s1 , &s2 , &s3 ,&s4 };char ***ptr = arr ;// 使用尽可能多的方式来通过ptr 正确输出 s1 s2 s3 以及 s4 
printf("s1:%s\n" , *arr[0] );
printf("s2:%s\n" , *ptr[1] );
printf("s3:%s\n" , **(ptr+2) );
printf("s4:%s\n" , **(3+ptr) );
printf("s4:%s\n" , *3[ptr] );// 尝试输出 s1 中的 字符 ‘E’
printf("s1:%c\n" , **arr[0] );
printf("s1:%c\n" , ***arr );
printf("s1:%c\n" , ***ptr );// 尝试输出 s3 中的 字符 ‘Y’
printf("s3:%s\n" , **(ptr+2));
printf("s3:%c\n" , ***(ptr+2));
printf("s3:%c\n" , **(ptr[2]));// 尝试输出 s4 中的 字符 ‘Z’
printf("s4:%s\n" , *ptr[3]);
printf("s4:%c\n" , (*ptr[3])[3]);
printf("s4:%c\n" , *((*ptr[3])+3));

数组指针

        概念: 一个指针,该指针指向一个数组。

        语法:

数组类型 (*ptr) [ 数量 ];

示例代码:

int arr[10] = {1,2,3,4,5,6,7,8,9,0};
float * f [3]; // &f 的类型是 float *(*) [3]// int *p [10]; // 指针数组int (*ptr) [10] ;  // 数组指针
ptr = &arr ;
// int *ptr1 = &arr ;  // &a 的类型是 : int (*)[10]// 如何把3改成30
arr[3] = 30 ;// ptr = &arr ;
(*ptr)[4]= 40 ;*((*ptr)+5) = 50 ;* ((*(ptr+1))-1) = 999 ; for (int i = 0; i < 10 ; i++)
{printf("arr[%d]:%d\n" , i , arr[i]);
}

三、勇士闯关秘籍

第一关

第二关

第三关

第四关

第五关

第六关

第七关

第八关

第九关

四、大杂脍

数组

概念:使用一篇连续的内存空间来存储一组类型相同的数据。

           可以使用它来定义一系列类型相同的数据。

语法

数据的类型   数组名 [ 元素的数量 ] ; 
int   arr_int [32] ;      // 定义了一组数据 32个(连续的内存空间)并该组数据的类型是int 类型  
float arr_float [32] ;    // 定义了一组数据 32个(连续的内存空间)并该组数据的类型是float 类型
double arr_double [64] ;  // 定义了一组数据 64个(连续的内存空间)并该组数据的类型是double 类型char  arr_str []  = "Hello" ; // 定义了一组数据(连续的内存空间)并该组数据的类型是char 类型// 以上语句中没有直接说明数组中元素的数量,那么因此就必须有初始化动作,数组的大小就由初始化的数据量来决定

注意:

  • 数组在定义完成的时候,他的大小必须是已知(定义时必须明确数组的大小)。
    • 因此在定义数组的时候要么就在 【】 中括号中写明元素的数量来确定他的大小。要么就给他进行初始化。

数组名字的含义:

数组名字通常有两种含义:

        整个数组的地址:

                在定义语句中数组名表示整个数组的地址。

                在 & 取地址符中, 数组名表示整个数组的地址。

                在sizeof 运算符中 数组名表示整个数组的地址。

        首元素首地址:

                除了以上三个情况其余的都表示首元素的首地址。

数组的下标:

        概念: 数组的下标实际上是基于数组的入口地址的偏移量,偏移量的单位则是该数据则类型(指针的加减运算)。

int arr [10] = {1,2,3,4,5,6,7,8,9,0};
arr[0]   -- >  0 没有做任何偏移,因此可以访问到数组中的第0个元素  --> 数组 1 
arr[3]   -- > 数组的第3个元素 --> 数据 4 

指针:

        概念

               指针也是一个变量,只不过这种变量专门用于存储指定数据的内存地址。

        既然指针变量用于存储的是地址数据,那么指针的大小就固定下来由系统的位数决定。

                    比如32位的系统他所有的地址都是32位的数据也就是4个字节

                        64位系统他所有的地址都是64位的数据也就是8个字节

        语法:

  指向的类型  (*指针的名字) ;int a = 123;
float f  = 2345.345;        
long l = 3245232345 ;int * ptr_int = &a;  // 定义了一个整形指针 ptr_int  并把a的地址存入其中
float (*ptr_float) = &f ; // 定义了一个浮点指针 ptr_float  并把f的地址存入其中
long * ptr_long = &l ; // 定义了一个long指针 ptr_long  并把l的地址存入其中

指针的加减操作:

概念: 指针的加减就是基于指针当前所指向的地址进行偏移运算,而偏移量的单位则取决于指针的类型。

因此当对一个指针进行+1 或 -1 操作时加减的单位是该指针自己的类型,与它所指向的数据类型没有任何关系。

(64位系统)
char * ptr_c =  0x100000 ;
short *ptr_s =  0x100000 ;
int *ptr_i = 0x100000 ;
long * ptr_l = 0x100000 ;ptr_c + 1 则偏移一个指针的类型char  也就是1个字节因此地址值会变成 0x100001
ptr_s + 1 则偏移一个指针的类型short  也就是2个字节因此地址值会变成 0x100002
ptr_i + 1 则偏移一个指针的类型int  也就是4个字节因此地址值会变成 0x100004
ptr_l + 1 则偏移一个指针的类型long  也就是8个字节因此地址值会变成 0x100008  int  ** ptr_1 = 0x100000 ;
char  ** ptr_2 = 0x100000 ;
float  ** ptr_3 = 0x100000 ;int  *** ptr_4 = 0x100000 ;
char  **** ptr_5 = 0x100000 ;
float  ***** ptr_6 = 0x100000 ;ptr_1  ptr_2  ptr_3  ptr_4  ptr_5  ptr_6 这些指针在+1 的时候都+ 系统的位数(64位系统) 8个字节  0x100008不管是多少级的指针只要超过了二级都是在+1一个地址的大小

指针数组:

                概念: 他是一个数组,该数组拥有一片连续的内存空间并该空间中存储了一组 指针数字据 (地址数据)。

                一个存储了一组指针的数组称为指针数组。

语法:

 指针的数据类型  *  (数组名字 [元素的数量]) ;int *   ( arr_ptr [3] ) ={&a , &b , &c } ; // 定义了一个数组,该数组中存储了 3个元素,每一个元素都是int 类型的地址 。

注意:

        指针数组的使用与数组没有任何区别。

实例代码:

int a = 123 ;
int b = 456 ;
int c = 789 ;// 定义了一个数组,该数组中存储了 3个元素,每一个元素都是int 类型的地址 。
int * arr_int_p [3] = {&a , &b , &c} ; // 分别把 a , b , c 的地址存入数组中// 如何访问该数组中的所有元素
printf( "arr_int_p[0]: %p:%d \n" , arr_int_p[0] , *arr_int_p[0] );
printf( "arr_int_p[0]: %p:%d \n" , *(arr_int_p + 1) ,  **(arr_int_p + 1)  );// ptr_int 是一个普通的整形指针,该指针存储了 &a 的地址 (二级指针)
int ** ptr_int = arr_int_p ;  // 使用二级指针来访问二维数组
printf ( "*(ptr_int + 2):%p:%d\n",  *(ptr_int + 2) , **(ptr_int + 2));

数组指针:

        概念: 他是一个指针变量,该指针变量存储的数据是一个数组类型是地址

        语法:

数组中元素的类型   (* 指针变量名) [ 数组的元素数量 ] ;int  (*p_int)  [10] ;  // 【整形数组指针】 定义了一个指针变量  p_int ,它指向的数据的地址应该是一个整形数组的地址, 而且该数组中有10个元素
float  (*p_float)  [10] ;  // 【浮点数组指针】 定义了一个指针变量  p ,它指向的数据的地址应该是一个浮点数组的地址, 而且该数组中有10个元素

实例代码:

int arr[10] = {1,2,3,4,5,6,7,8,9,0};// &arr 表示整个数组的地址,因此他的类型是数组类型的地址
int (* ptr) [10] = &arr ;// ptr = &arr   *ptr == *&arr == arr 
// arr[2] 
printf ("(*ptr)[2]:%d\n"  ,(*ptr)[2] ) ;
printf ("* ((*ptr) + 3):%d\n" , * ((*ptr) + 3) ) ;// 使用一个一级指针来访问数组中的各项元素
int * p = arr ;
// p = arr 
// arr[5] 
printf( "p[5]:%d\n" , p[5] );
printf( "*(p + 6):%d\n" , *(p + 6) );

循环:

        概念: 使得每一段代码在特定的条件满足请跨下重复地运行。

        循环的类型:

for   是一个集成度比较高的循环结构,它包含的【初始化】、【判断】、【迭代语句】
while 是一个在条件满足的情况下执行的一个循环
do-while 是一个在执行一次代码后判断如果条件满足则执行重复代码的一个循环

for循环:

        语法:

for ( 初始化语句可以使用,逗号一次性写多个  ;   循环的判断语句   ;   循环控制变量的更新迭代 也可以是用,逗号表达式来连接多个表达式 )
{}

注意:

while循环:

        语法:

                只要布尔表达式为真(非零) ,的情况下循环体中的代码就会被不断循环

while ( 布尔表达式 )
{// 循环体}

do-while循环:

        语法:

先执行一次循环体中的代码,然后判断布尔表达式是否为真,如果为真则重复执行循环体中的代码。

do
{// 循环体
}while(布尔表达式) ;

逗号表达式

        实例:逗号表达式会从左往右依次运算,最终的值取决于最后一个表达式的值。

 int a = 123 ;int b = 567 ;int c = 789 ;int d = (a++ , ++b , ++c) ;printf("a:%d b:%d c:%c d:%d\n" , a  , b, c , d  );

总结

        本文介绍了C语言进阶之路上小BOSS的一些特点和打败方法,大家认真学习即可逐步突破,最终问鼎巅峰~

        本文参照 粤嵌文哥 部分课件经整理和修改后发布在C站,如有转载,请联系本人

相关文章:

C语言进阶之路-指针、数组等混合小boss篇

目录 一、学习目标&#xff1a; 二、指针、数组的组合技能 引言 指针数组 语法 数组指针 三、勇士闯关秘籍 四、大杂脍 总结 一、学习目标&#xff1a; 知识点&#xff1a; 明确指针数组的用法和特点掌握数组指针的用法和特点回顾循环等小怪用法和特点 二、指针、数…...

【矩阵论】Chapter 7—Hermite矩阵与正定矩阵知识点总结复习

文章目录 1 Hermite矩阵2 Hermite二次型3 Hermite正定&#xff08;非负定矩阵&#xff09;4 矩阵不等式 1 Hermite矩阵 定义 设 A A A为 n n n阶方阵&#xff0c;如果称 A A A为Hermite矩阵&#xff0c;则需满足 A H A A^HA AHA&#xff0c;其中 A H A^H AH表示 A A A的共轭转…...

Golang语言基础之切片

概述 数组的长度是固定的并且数组长度属于类型的一部分&#xff0c;所以数组有很多的局限性 func arraySum(x [3]int) int{sum : 0for _, v : range x{sum sum v}return sum } 这个求和函数只能接受 [3]int 类型&#xff0c;其他的都不支持。 切片 切片&#xff08;Slic…...

SpringCloud-服务消费者Fegin调用时无法获取异常信息

一、前言 假设有以下需求&#xff1a; 服务消费者A调用服务提供者B往MySQL新增一条人员信息服务提供者做了一个逻辑判断&#xff1a;若无该人员信息则新增&#xff0c;若已存在该人员信息&#xff0c;则返回给消费者异常状态码及异常信息&#xff1a;“请勿添加重复数据” 问…...

re:invent 2023 Amazon Q 初体验

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre&#xff0c;知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 前言 亚马逊云科技在2023 re:Invent全球大会上宣布推出 Amazon…...

认知觉醒(四)

认知觉醒(四) 第三节 耐心&#xff1a;得耐心者得天下 20世纪八九十年代&#xff0c;金庸的武侠小说风靡全国。如今&#xff0c;虽然几十年过去了&#xff0c;金庸先生也已与世长辞&#xff0c;但他留下的作品依然广受欢迎&#xff0c;被奉为经典。如此成就&#xff0c;自然…...

AI模型部署 | onnxruntime部署YOLOv8分割模型详细教程

本文首发于公众号【DeepDriving】&#xff0c;欢迎关注。 0. 引言 我之前写的文章《基于YOLOv8分割模型实现垃圾识别》介绍了如何使用YOLOv8分割模型来实现垃圾识别&#xff0c;主要是介绍如何用自定义的数据集来训练YOLOv8分割模型。那么训练好的模型该如何部署呢&#xff1f…...

模拟电路学习笔记(一)之芯片篇(持续更新)

模拟电路学习笔记&#xff08;一&#xff09;之芯片篇&#xff08;持续更新&#xff09; 1.CD4047BE芯片 CD4047是一种包含高电压的多谐振荡器&#xff0c;该器件的操作可以在两种模式下完成&#xff0c;分别是单稳态和非稳态。CD4047需要一个外部电阻器和电容器来决定单稳态…...

如何利用CentOS7+docker+jenkins+gitee部署springboot+vue前后端项目(保姆教程)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…...

qt 5.15.2 主窗体事件及绘制功能

qt 5.15.2 主窗体事件及绘制功能 显示主窗体效果图如下所示&#xff1a; main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.setFixedWidth(600);w.setFixedHeight(6…...

(2)(2.4) TerraRanger Tower/Tower EVO(360度)

文章目录 前言 1 安装传感器并连接 2 通过地面站进行配置 3 参数说明 前言 TeraRanger Tower 可用于在 Loiter 和 AltHold 模式下进行目标规避。传感器的最大可用距离约为 4.5m。 TeraRanger Tower EVO 可用于在 Loiter 和 AltHold 模式下进行目标规避。传感器的最大可用…...

Redis_主从复制、哨兵模式、集群模式详解

Redis的主从复制 为什么Redis要引入主从复制&#xff1f;what&#xff1f; 在这里博主为小伙伴们简单的做下解释&#xff0c;可以了解一下 实际生产环境下&#xff0c;单机的redis服务器是无法满足实际的生产需求的。 第一&#xff0c;单机的redis服务器很容易发生单点故障&am…...

关于神舟-战神TA5NS系统重装问题

加装固态卡在log处无法开机问题 下面是我的步骤 1.按f7选择pe安装系统&#xff0c;然后发现卡在战神log处不转动 2.下载驱动 TA5NS驱动地址 下载RAID驱动&#xff08;如果没有私信我&#xff0c;我网盘里有&#xff09;&#xff0c;拷到u盘中&#xff0c;然后进入pe系统里面…...

前端大文件上传webuploader(react + umi)

使用WebUploader还可以批量上传文件、支持缩略图等等众多参数选项可设置&#xff0c;以及多个事件方法可调用&#xff0c;你可以随心所欲的定制你要的上传组件。 分片上传 1.什么是分片上传 分片上传&#xff0c;就是将所要上传的文件&#xff0c;按照一定的大小&#xff0c;将…...

人大金仓(kingbase)数据库常用sql命令

一. 字段 1. 添加 alter table book add column book_id varchar not null, book_title varchar(10) default ;2. 删除 alter table book drop book_id, book_title;// 外键时 alter table book drop book_id, book_title cascade;3. 修改类型 alter table book alter colu…...

HashMap相关专题

前置知识&#xff1a;异或运算 异或运算介绍 异或有什么神奇之处&#xff08;应用&#xff09;&#xff1f; &#xff08;1&#xff09;快速比较两个值 &#xff08;2&#xff09;我们可以使用异或来使某些特定的位翻转&#xff0c;因为不管是0或者是1与1做异或将得到原值的相…...

threejs WebGLRenderer 像素比对画布大小的影响

官方文档 - WebGLRenderer .setPixelRatio ( value : number ) : undefined 设置设备像素比。通常用于避免HiDPI设备上绘图模糊 .setSize ( width : Integer, height : Integer, updateStyle : Boolean ) : undefined 将输出canvas的大小调整为(width, height)并考虑设备像素比…...

RocketMQTemplate.send() 与 RocketMQTemplate.syncSend() 方法详解

Apache RocketMQ 是一款强大的分布式消息中间件&#xff0c;与 Spring Boot 集成后&#xff0c;通过 RocketMQTemplate 提供了多种方法来发送消息。其中&#xff0c;send() 和 syncSend() 是两个常用的发送消息方法&#xff0c;本文将深入探讨它们的区别以及详细解释这两个方法…...

波奇学C++:类型转换和IO流

隐式类型转换 int i0; double pi; 强制类型转换 int* pnullptr; int a(int)p; 单参数构造函数支持隐式类型转换 class A { public:A(string a):_a(a){} private:string _a; }; A a("xxxx"); //"xxx" const char* 隐式转换为string 多参数也可以通过{…...

集成开发环境 PyCharm 的安装【侯小啾python基础领航计划 系列(二)】

集成开发环境PyCharm的安装【侯小啾python基础领航计划 系列(二)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...