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站,如有转载,请联系本人

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

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

相关文章

2023-12-05 Qt学习总结 (AI辅助) 未完待续

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言一 Qt是什么二 Qt开发工具链三 Qt编程涉及的术语和名词四 Qt Creator使用五 hello Qt!六 Qt控件和事件七 Qt信号和槽八 Qt自定义信号和槽九 Qt QObject基类十 QWidget基类十一 QMainWindow基类十二 QLabel文本框…

02 硬件知识入门(电容)

1 电容的定义和主要参数 1.1 电容的符号 1.2 电容的作用 1.3 电容滤波 1.4 电容的标号命名规则 1.5电容的&#xff08;串联并联&#xff09;计算公式 与电阻的计算公式相反 1.5.1 电容的并联 1.5.2 电容的串联

上传文件接口的创建_FastAPI

上传文件接口的创建 功能描述代码效果演示与注意事项 功能描述 前端用户需要上传文件至平台&#xff0c;就比如CSDN的上传资源部分&#xff0c;都是一样的功能逻辑&#xff0c;想要实现这个功能其实并不难。 这里以上传的JSON格式文件为例&#xff0c;其他格式文件的话可以自…

用python找到音乐数据的位置,并实现音乐下载

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 需求分析: 有什么需求要实现? 这些需求可以用什么技术实现? 找到音乐数据的位置, 分析 不同音乐的链接有何规律?https://lx-sycdn.kuwo.cn/b784688662c82db8…

国产接口测试工具APIpost

说实话&#xff0c;了解APIpost是因为&#xff0c;我的所有接口相关的文章下&#xff0c;都有该APIpost水军的评论&#xff0c;无非就是APIpost是中文版的postman&#xff0c;有多么多么好用&#xff0c;虽然咱也还不是什么啥网红&#xff0c;但是不知会一声就乱在评论区打广告…

Python如何传递任意数量的实参及什么是返回值

Python如何传递任意数量的实参 传递任意数量的实参 形参前加一个 * &#xff0c;Python会创建一个已形参为名的空元组&#xff0c;将所有收到的值都放到这个元组中&#xff1a; def make_pizza(*toppings):print("\nMaking a pizza with the following toppings: "…

Retrofit的转换器

一、前言 1.为什么要使用Retrofit转换器 在我们接受到服务器的响应后&#xff0c;目前无论是OkHttp还是Retrofit都只能接收到String字符串类型的数据&#xff0c;在实际开发中&#xff0c;我们经常需要对字符串进行解析将其转变为一个JavaBean对象&#xff0c;比如服务器响应…

Codeforces Round 913 (Div. 3)(A~G)

1、编程模拟 2、栈模拟 3、找规律&#xff1f;&#xff08;从终止状态思考&#xff09; 4、二分 5、找规律&#xff0c;数学题 6、贪心&#xff08;思维题&#xff09; 7、基环树 A - Rook 题意&#xff1a; 直接模拟 // Problem: A. Rook // Contest: Codeforces - C…

火焰图的基本认识与绘制方法

火焰图的认识与使用-目录 火焰图的基本认识火焰图有以下特征(on-cpu)火焰图能做什么火焰图类型On-CPU 火焰图和Off-CPU火焰图的使用场景火焰图分析技巧 如何绘制火焰图生成火焰图的流程1.生成火焰图的三个步骤 安装火焰图必备工具1.安装火焰图FlameGraph脚本2.安装火焰图数据采…

智能优化算法应用:基于人工水母算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工水母算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工水母算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工水母算法4.实验参数设定5.算法结果6.参考…

4 STM32MP1 Linux系统启动过程

1. ROM代码 这是ST官方写的代码&#xff0c;在STM32MP1出厂时就已经烧录进去&#xff0c;不能被修改。ROM代码是上电以后首先执行的程序&#xff0c;它的主要工作就是读取STM32MP1的BOOT引脚电平&#xff0c;然后根据电平来判断当前启动设备&#xff0c;最后从选定的启动设备里…

快速认识,后端王者语言:Java

Java作为最热门的开发语言之一&#xff0c;长居各类排行榜的前三。所以&#xff0c;就算你目前不是用Java开发&#xff0c;你应该了解Java语言的特点&#xff0c;能用来做什么&#xff0c;以备不时之需。 Java 是一种高级、多范式编程语言&#xff0c;以其编译为独立于平台的字…

快手数仓面试题附答案

题目 1 讲一下你门公司的大数据项目架构&#xff1f;2 你在工作中都负责哪一部分3 spark提交一个程序的整体执行流程4 spark常用算子列几个&#xff0c;6到8个吧5 transformation跟action算子的区别6 map和flatmap算子的区别7 自定义udf&#xff0c;udtf&#xff0c;udaf讲一下…

Java链接数据库

本文介绍的是Java链接数据库中的JDBC操作&#xff0c;JDBC虽然现在用的不多&#xff0c;但面试的时候会问道。需要有相应的了解。下面以链接MySQL为例子。 JDBC 什么jdbc Java DataBase Connectivity是一种用于执行SQL语句的Java API&#xff0c;它由一组用Java语言编写的类和…

初识Protobuf与Protobuf的安装

目录 一、Protobuf 1.回顾序列化 2.Protobuf的特性 3.Protobuf的下载 ①ProtoBuf 在 window 下的安装 ②ProtoBuf 在 Linux 下的安装 一、Protobuf 1.回顾序列化 我们在先前的学习中也遇到过序列化。所谓序列化我的理解是&#xff0c;将复杂的对象以特定的方式转换以便于…

【计算机网络笔记】物理层——信道与信道容量

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

【稳定检索|投稿优惠】2024年光电信息与机器人发展国际会议(ICOIRD 2024)

2024年光电信息与机器人发展国际会议(ICOIRD 2024) 2024 International Conference on Optoelectronic Information and Robot Development(ICOIRD 2024) 一、【会议简介】 信息技术与人工智能的浪潮正在激荡&#xff0c;不断刷新我们生活的页面&#xff0c;深刻烙印在光电信息…

Homework 3: Higher-Order Functions, Self Reference, Recursion, Tree Recursion

Q1: Compose 编写一个高阶函数composer&#xff0c;它返回两个函数func和func_adder。 func是一个单参数函数&#xff0c;它应用到目前为止已经组合的所有函数。这些函数将首先应用最新的函数&#xff08;参见doctests和示例&#xff09;。 func_adder用于向我们的组合添加更多…

“快慢指针”思想在物理或者逻辑循环中的应用

1 基础概念 1.1 什么是物理循环和逻辑循环&#xff1f; 物理循环是指物理索引访问顺序上相邻&#xff0c;逻辑上也相邻&#xff0c;比如循环链表&#xff0c;逻辑循环则指物理的索引上不一定相邻 1.2 快慢指针本质上可以解决逻辑循环问题&#xff0c;而物理循环也属于逻辑循…

用AI在抖音直播做姓氏头像的全新玩法,详细分析制作教程

前段时间在圈子里给大家分享了用AI写艺术字做小红书账号案例玩法&#xff0c;同学们都比较热衷学习。纷纷动手实践。 事实上用AI艺术字变现玩法还有许多。 例如上周末在星球给圈友们分享的一个AI艺术字直播的抖音账号&#xff0c;直播内容形式很简单&#xff0c;就是展现用AI…