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

news2024/11/19 17:30:32

目录

指针数组

数组指针

指针和二维数组

通过指针访问二维数组

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

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

地址等级

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.coloradmin.cn/o/1692080.html

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

相关文章

【Windows】Adobe Lightroom(Lr2024) v7.3 (x64)安装教程

软件介绍 Adobe Lightroom是一款专业的照片编辑和管理软件&#xff0c;旨在帮助摄影师和视觉艺术家管理、编辑和处理大量照片。它提供了一套强大的工具和功能&#xff0c;使用户能够轻松地实现照片的编辑、整理和分享。 以下是Adobe Lightroom的一些主要特点和功能&#xff1…

Vue3实战Easy云盘(四):使用空间+文件预览+文件分享+文件下载

一、空间使用 Framework.vue中 &#xff08;1&#xff09;引入接口 const api {getUseSpace: "/getUseSpace",logout: "/logout", }; &#xff08;2&#xff09;回调 // 使用空间 const useSpaceInfo ref({ useSpace: 0, totalSpace: 1 }); const g…

深入了解 CSS 预处理器 Sass

今天我们来深入探讨一下 CSS 预处理器 Sass。我们将学习什么是 Sass,如何使用它,以及它是如何工作的。 什么是 Sass? Sass 是 syntactically awesome style sheets 的缩写,是一种 CSS 预处理器。它是 CSS 的扩展,为基础 CSS 增加了更多的功能和优雅。普通的 CSS 代码很容…

新手如何收集关键词,拥有源源不断的写作素材资源?分享6种通用方法!

好多个伙伴跟我讲&#xff0c;自己写了一段时间的微信公众号&#xff0c;现在找不到该写什么内容。能写的&#xff0c;自己都写完了&#xff0c;该写的&#xff0c;自己也写了&#xff0c;每天都在为写什么苦恼。 对于新手&#xff0c;如何拥有源源不断的写作素材资源&#xf…

搭建自己的视频通话服务器Janus(WebRTC)

1. 安装janus apt install janus 高版本的Ubuntu已经可以直接安装了&#xff0c;不要编译那么麻烦了 2. 安装nginx janus 是后端&#xff0c;需要nginx或者其他等提供前端页面的服务器&#xff0c;此外因为这里并没有正式的证书&#xff0c;只能用自签名的证书用于https。 …

【竞技宝】英超:足总杯踢完解雇腾帅,曼联管理层心意已决

根据知名媒体《卫报》的报道,足总杯之后曼联将会 解雇滕哈格,哪怕他率领曼联队能够击败强大的曼城夺冠,也无法改变他将下课的事实。因为曼联本赛季的联赛排名只有第8名,已经来到了近30年来的最差成绩,这种情况下滕哈格与曼联的缘分似乎将被终结。 滕哈格上赛季成为曼联的主帅,由…

mysql驱动版本变更导致查询数据结果一直是空

1 引言 最近接手了一个已离职同事的java项目&#xff0c;这个项目中原来使用了自己的mysql驱动版本&#xff0c;并未使用公司公共依赖中的版本号。我想为了统一版本号&#xff0c;就将当前项目中pom文件中mysql的版本号verson给去除了。没怎么自测&#xff0c;就直接发到测试环…

BGP路由优化

一&#xff0c;拓扑 二&#xff0c;要求 用preva1策略确保R4通过R2到达192.168.10.0/24 &#xff0c;用AS Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 .用Local Preference策略&#xff0c;确保R1通过R2到达1…

Excel中Lookup函数

#Excel查找函数最常用的是Vlookup&#xff0c;而且是经常用其精确查找。Lookup函数的强大之处在于其“二分法”的原理。 LOOKUP&#xff08;查找值&#xff0c;查找区域&#xff08;Vector/Array&#xff09;&#xff0c;[返回结果区域]&#xff09; 为什么查找区域必须升序/…

Python 小游戏——贪吃蛇

Python 小游戏——贪吃蛇 项目介绍 贪吃蛇游戏是一款通过上下左右方向键控制贪吃蛇吃到豆豆以获取积分的游戏&#xff0c;该项目使用Python语言进行实现。主要使用了Pygame库来处理图形和用户输入。 环境配置 该项目需要在Pycharm的终端中执行以下指令来安装Pygame库&#…

MySQL的主从复制(主从数据库都是Linux版本)

概述 1.什么是主从复制 主从复制是指将主库的 DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持一致。 2.主从复制作用 数据备份&#xff1a;通过主从复…

014_C标准库函数之<stdio.h>

【背景】 今天这个主要说的是<stdio.h>头文件&#xff0c;大家众所周知&#xff0c;这个是我们学习C语言时第一个接触到的头文件了&#xff0c;那么为什么我不一开始就介绍这个头文件呢&#xff1f;我觉得有两个原因&#xff0c;如下&#xff1a; 1.一开始大家的编程思…

【JavaEE进阶】——Spring Web MVC (响应)

目录 &#x1f6a9;学习Spring MVC &#x1f388;返回静态网页 &#x1f388;返回数据ResponseBody &#x1f388;返回html代码片段 &#x1f388;返回JSON &#x1f388;设置状态码 &#x1f388;设置Header &#x1f6a9;学习Spring MVC 既然是 Web 框架, 那么当⽤⼾在…

Linux--10---安装JDK、MySQL

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 安装JDK[Linux命令--03----JDK .Nginx. 数据库](https://blog.csdn.net/weixin_48052161/article/details/108997148) 第一步 查询系统中自带的JDK第二步 卸载系统中…

【医学AI|顶刊精析|05-25】哈佛医学院·告别切片局限:3D病理如何革新癌症预后

小罗碎碎念 先打个预防针&#xff0c;我写这篇推文用了两个多小时&#xff0c;这就意味着要读懂这篇文章不太容易&#xff0c;我已经做好反复阅读的准备了。不过&#xff0c;风险之下&#xff0c;亦是机会&#xff0c;读懂的人少&#xff0c;这个赛道就越值得押宝。 在正式阅…

【浅水模型MATLAB】尝试完成一个数值模拟竞赛题

【浅水模型MATLAB】尝试完成一个数值模拟竞赛题 前言题目描述问题分析理论基础控制方程数值方法边界条件 代码框架与关键代码结果展示写在最后 更新于2024年5月25日 前言 最近看到第四届水科学数值模拟创新大赛的通知&#xff0c;就好奇翻看了前几年的比赛试题。发现去年的一个…

Ajax异步删除

在页面上定义一个按钮 <button type"button" class"btn"><a href"JavaScript:;" class"id" b_id"{{$attachment[id]}}">删除</a></button> js代码 <script>$(.id).click(function (){va…

vs2019 c++ 函数的返回值是对象的值传递时候,将调用对象的移动构造函数

以前倒没有注意过这个问题。但编译器这么处理也符合移动构造的语义。因为本来函数体内的变量也要离开作用域被销毁回收了。测试如下&#xff1a; 谢谢

轻松拿捏C语言——【字符函数】字符分类函数、字符转换函数

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; &#x1f339;如有问题&#xff0c;欢迎指正 感谢 目录&#x1f451; 一、字符分类函数&#x1f319; 二、字符转换函数…