嵌入式全栈开发学习笔记---C语言笔试复习大全20

目录

指针数组

数组指针

指针和二维数组

通过指针访问二维数组

通过数组指针访问二维数组

用指针表示二维数组并访问

地址等级

0级地址:

一级地址:

二级地址:

三级地址:

总结

指针的指针

命令行参数


上一篇复习了指针函数和函数指针,这一节开始复习数组指针和指针数组的内容。

说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。

这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。

注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!

vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。

我们正式开始:

指针数组

指针数组是数组一个数组的元素值为指针,则该数组是指针数组。

指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。

指针数组说明的一般形式为:

类型说明符 *数组名[数组长度]

其中类型说明符为指针所指向的变量的类型。

例如: int *pa[3];

表示pa是一个指针数组,它有三个元素,每个元素值都是一个指针,指向整型变量。

数组指针

数组指针是一个指针!该指针指向数组(一维或二维都可以)。

例如:

int (*p)[5];

可以这么理解,p是一个指针,指向一个数组,该数组有5个元素,每个元素都是整型。

注意:

这样写是错误的:int b[5]={0}; int*p=&b;是错误的,因为&b取出来的是整个数组b的地址,而int*p是表示p指向int型的数,是4个字节,而&b一次取出来了20个字节,类型不兼容。

这样写是对的:int (*p)[5]=&b;此时这个p指向的是整个数组b

指针和二维数组

通过指针访问二维数组

示例:

int array[3][4]={{1,2,3,4}, {2,3,4,5}, {3,4,5,6}};

int *s1[3]={array[0], array[1], array[2]};

遍历:

示例:

int i;//行
Int j;//列for(i=0; i<sizeof(s1)/sizeof(s1[0]);i++){for(j=0;j<sizeof(array[0])/sizeof(array[0][0]);j++){printf(“%lu”,*(s1[i]+j));  //等价于s[i][j]}printf(“\n”);}

注意:不能写成j<sizeof(array[0])/sizeof(s1[0]),因为sizeof(s1[0])算出来是一个指针的大小

通过数组指针访问二维数组

int(*s1)[4]=array;//s1指向array的第一行,第一行相当于一个一维数组,有4个元素,每个元素是int型

遍历:

for(i=0; i<3;i++)

{

        for(j=0;j<4;j++)

{

        printf(“%d ”, *(*(S1+i)+j);

}

        printf(“\n”);

}

注:**S1的含义:*S1取出来S1首元素的地址,

然后再**S1取出来首元素的值

用指针表示二维数组并访问

int *S1=&array[0][0];

for(i=0;i<12;i++)

{

        printf(“%d ”,s1[i]);

}

printf(“\n”);

地址等级

0级地址:没有地址,就是元素本身;

一级地址:元素的地址,4字节;

二级地址:行的地址,16字节;

三级地址:数组的地址,48字节;(三行四列,12个元素,每个元素4字节)

0级地址:

a[0][0]:不存在地址,a[0][0]+1就是数值上的加1;

一级地址:

&a[0][0],a[0], *a;

二级地址:

a,  &a[0], &a[1];

三级地址:

&a;

总结

对于二维数组a[3][4]:

注:*a的“*”取值号只是修改了含义,不是真正的访问内存中的数值,原本a是表示二维数组首行的地址,*取值后变成首行首元素的地址。我们可以这样记忆:原本a是二维数组的首行的地址,而一行的地址是用本行的第一个元素的地址表示的,*a里面存放的是首行的地址,即*a就是首行首元素的地址。*a的“*”主要是将二级地址变成一级地址。

1、不要把&a[i]简单的理解为a[i]的物理地址,因为并不存在a[i]这个变量。它只是一种地址的计算方法,能得到第i行的地址。

2、&a[i]和a[i]的值是一样的,但它的含义却不同。 &a[i]或a+i指向行,而a[i]或*(a+i)指向列。当下标j=0时,&a[i]和a[i]+j的值相等。*(a+i)只是a[i]的另一种表示形式。在二维数组中,a+i=a[i]=*(a+i)=&a[i]=&a[i][0]即它们的地址值是相等的。

指针的指针

指针的指针:指向指针的指针

下面这段代码存在什么问题?

void init_s(char *s1)
{s1 = malloc(1024);
}int main()
{char *s;init_s(s);strcpy(s, “helloworld”);return 0;
}

程序会死掉,因为 init_s(char *s1)的函数体运行完之后会释放掉空间,根本就无法将字符串拷贝进去。

可以改成:

void init_s(char **s1)//形参改成指针的指针
{s1 = malloc(1024);//将申请的空间的地址赋值给s1指向的那块内存
}int main()
{char *s;init_s(&s);//取指针的地址传过去strcpy(s, “helloworld”);return 0;
}

这是我之前的博文中也讲过的:如果要修改实参的值,一定要取地址!

命令行参数

main (int argc,char *argv[ ])

argc(第一个形参)必须是整型变量,

argv( 第二个形参)必须是指向字符串的指针数组。

argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数);

argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 针数组的长度即为参数个数。

示例:

#include <stdio.h>int main(int argc, char*argv[ ])//argc是参数的个数,char*argv[ ]保存了参数的地址
{int i;for(i=0;i<argc;i++){   printf("第 %d 个参数是%s\n",i,argv[i]);}   return 0;
}

运行结果:

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

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

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

相关文章

路由_传递params参数和query参数

传递params参数 传递params参数可以直接在路径后面加上参数&#xff1a; 上述就是在路径变化的时候传过去三个值分别为哈哈、嘿嘿、呵呵的参数 但是这样的话会被认为三个参数是路径的一部分&#xff0c;计算机没有办法区分哪些是路径哪些是参数&#xff0c;所以首先要在这条路…

React useState数组新增和删除项

在React中&#xff0c;我们可以使用useState钩子来管理组件的状态&#xff0c;其中包括数组。如何在React函数组件中对数组进行增加和删除项的操作&#xff1f; 新增项时&#xff1a;我们可以对原数组进行解构&#xff0c;并把新增项一起加入到新数组&#xff1b; 删除项时&…

LeetCode 264 —— 丑数 II

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 第一个丑数是 1 1 1&#xff0c;由于丑数的质因子只包含 2 、 3 、 5 2、3、5 2、3、5&#xff0c;所以后面的丑数肯定是前面的丑数分别乘以 2 、 3 、 5 2、3、5 2、3、5 后得到的数字。 这样&#xff0c;我…

电脑同时配置两个版本mysql数据库常见问题

1.配置时&#xff0c;要把bin中的mysql.exe和mysqld.exe 改个名字&#xff0c;不然两个版本会重复&#xff0c;当然&#xff0c;在初始化数据库的时候&#xff0c;如果时57版本的&#xff0c;就用mysql57(已经改名的)和mysqld57 代替 mysql 和 mysqld 例如 mysql -u root -p …

LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战

LLM 大模型学习必知必会系列(十)&#xff1a;基于AgentFabric实现交互式智能体应用,Agent实战 0.前言 **Modelscope **是一个交互式智能体应用基于ModelScope-Agent&#xff0c;用于方便地创建针对各种现实应用量身定制智能体&#xff0c;目前已经在生产级别落地。AgentFabri…

01.msf

文章目录 永恒之蓝下载msfconsolemsfvenom 永恒之蓝 下载 msdn.itellyou.cn msfconsole M e t a s p l o i t C y b e r M i s s i l e C o m m a n d Metasploit Cyber Missile Command MetasploitCyberMissileCommand 的简称 search ms17_010 use 0 或者 use exploit/wind…

从零开始:手把手教你使用Python实现PDF到Excel的转换

来百 在日常工作和学习中&#xff0c;我们经常会遇到需要将PDF文件中的数据提取到Excel表格中的情况。可能是为了进行数据分析、报告生成或者其他目的。虽然手动复制粘贴是一种方法&#xff0c;但对于大量的数据来说&#xff0c;这种方式显然效率太低。幸运的是&#xff0c;Py…

npm 错误,ERESOLVE unable to resolve dependency tree

npm 错误,ERESOLVE unable to resolve dependency tree 在命令中增加 --legacy-peer-dep 选项或者–force npm install --legacy-peer-depsnpm install --force

保存商品信息功能(VO)

文章目录 1.分析前端保存商品发布信息的json数据1.分析commoditylaunch.vue的submitSkus1.将后面的都注销&#xff0c;只保留查看数据的部分2.填写基本信息3.保存信息&#xff0c;得到json4.使用工具格式化一下 2.使用工具将json转为model3.根据业务修改vo&#xff0c;放到vo包…

「网络流浅谈」最大流的应用

更好的阅读体验 二分图匹配 考虑如何将二分图匹配问题&#xff0c;转化为流网络。设置 1 1 1 个汇点和源点&#xff0c;从源点向二分图一侧的每一个点连边&#xff0c;从另一侧向汇点连边&#xff0c;边权均为 1 1 1&#xff0c;二分图中的边也全部加入&#xff0c;权值设为…

【第1章】SpringBoot入门

文章目录 前言一、版本要求1. SpringBoot版本2. 其他2.1 System Requirements2.2 Servlet Containers2.3 GraalVM Native Images 3. 版本定型 二、新建工程1.IDEA创建 ( 推荐 ) \color{#00FF00}{(推荐)} (推荐)2. 官方创建 三、第一个SpringBoot程序1. 引入web2. 启动类3. 启动…

Edge浏览器:重新定义现代网页浏览

引言 - Edge的起源与重生 Edge浏览器&#xff0c;作为Microsoft Windows标志性的互联网窗口&#xff0c;源起于1995年的Internet Explorer。在网络发展的浪潮中&#xff0c;IE曾是无可争议的霸主&#xff0c;但随着技术革新与用户需求的演变&#xff0c;它面临的竞争日益激烈。…

用这8种方法在海外媒体推广发稿平台上获得突破-华媒舍

在今天的数字时代&#xff0c;海外媒体推广发稿平台已经成为了许多机构和个人宣传和推广的有效途径。如何在这些平台上获得突破并吸引更多的关注是一个关键问题。本文将介绍8种方法&#xff0c;帮助您在海外媒体推广发稿平台上实现突破。 1. 确定目标受众 在开始使用海外媒体推…

篮球论坛|基于SprinBoot+vue的篮球论坛系统(源码+数据库+文档)

篮球论坛系统 目录 基于SprinBootvue的篮球论坛系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff…

AI大模型探索之路-实战篇5: Open Interpreter开放代码解释器调研实践

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;DB-GPT数据应用开发框架调研实践 目录 系列篇章&#x1f4a5;前言一、何为Open Interpreter&#xff1f;二、与 ChatGPT 的代码解释器比较三、 Open Interpreter的特性1、强大的本地计算能力2、丰富的功能3、高度的…

Spark在YARN上运行图解(资源调度+任务调度)及案例

前提&#xff1a;已经安装了spark集群&#xff0c;可参考上篇文章搭建&#xff1a;http://t.csdnimg.cn/UXBOp 一、Spark集群配置YARN 1、增加hadoop 配置文件地址 vim spark-env.sh 增加export HADOOP_CONF_DIR/usr/local/soft/hadoop-3.1.1/etc/hadoop 2、关闭虚拟内存 cd …

结构安全预警?事前发现?人工观测VS自动化监测,谁更胜一筹?

人工检测是依靠目测检查或借助于便携式仪器测量得到的信息&#xff0c;但是随着整个行业的发展&#xff0c;传统的人工检测方法已经不能满足检测需求&#xff0c;从人工检测到自动化监测已是必然趋势。 a. 从检测方式看 人工检测需要耗费大量的精力&#xff0c;从摆放检测工具到…

Golang | Leetcode Golang题解之第110题平衡二叉树

题目&#xff1a; 题解&#xff1a; func isBalanced(root *TreeNode) bool {return height(root) > 0 }func height(root *TreeNode) int {if root nil {return 0}leftHeight : height(root.Left)rightHeight : height(root.Right)if leftHeight -1 || rightHeight -1 …

最热门好用骨传导耳机推荐!!分享六大实用选购技巧助你挑选!

耳机基本是每人人手一台&#xff0c;不管是在地铁上还是在公交上&#xff0c;都可以看到很多人戴着耳机度过空余的时光&#xff0c;甚至现在人们在耳机的选择方面更加偏向于骨传导耳机&#xff0c;开放耳道的奇特设计在户外佩戴的时候可以更好的感知到周围的环境音&#xff0c;…