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

目录

指针和字符串

用数组和指针定义字符串

两种定义方法有什么区别?

第一个区别:

第二个区别:

第三个区别:

指针数组


上一篇复习了指针和数组,这一篇我们来复习指针和字符串

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

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

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

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

我们正式开始:

指针和字符串

用数组和指针定义字符串

char str[ ] = “helloworld”; //数组

printf(“%s\n”, str);

char *s = “helloworld”; //字符串常量

printf(“%s\n”, s);

指针变量名和数组名都是首元素的地址。

两种定义方法有什么区别?

第一个区别:

定义为数组时,只用了一个空间;定义为指针的话,用了两块空间:

第二个区别:

char str[ ] = “helloworld”; //数组

定义为数组类型的时候,str++是不能运行的,str[0]++可以运行。

因为str是首元素的地址,也就是当我们定义这个数组的时候,内存已经为这个数组分配好了空间,str固定了是首元素的地址,如果你想让它往后挪的话是不行的,也就是说str++是不可以的。所以请记住:数组名是一个指针常量,不能被修改!

但是str[0]++表示的是元素加1,也就是首元素的值加1,这个是可以的。比如str[0]就’h’,加1就变成了i。所以也请记住:数组里面的内容是可以被修改的。

char *s = “helloworld”; //字符串常量

定义为指针类型的时候,s++可以运行,s[0]++不可以运行。

因为“helloworld”存放在只读数据区。s++相当于是指针加1,s存的是首字符的地址,加1就指向第二个字符的地址。s[0]++相当于是数组首元素的值加1,那就是’h’变成了’i’,但是,请注意!“helloworld”存放在只读数据区,所以它能被修改吗???肯定不能被修改,所以s[0]++会出现段错误,并不会成功运行。

第三个区别:

比如不能写成char str[20]; str=”helloworld’;因为我们说过数组名是一个指针常量不能被修改。

但是比如char *s; s=”helloworld”;这样写是可以的,s是一个指针,把“helloworld”的地址赋值给了s。

新的问题又又又来了......

这里要注意我们上一篇所讲的野指针的区别:

我们上一篇讲的是:

如果定义指针没有初始化,则变成野指针。

int *p; //如果p是局部变量,则为垃圾值,称为野指针

*p = 100; //访问不能访问的内存(野地址),程序奔溃

注:我们也不能自己去指针的内存地址, 否则它也是野指针,比如int *p=(int*)0x10000; *p=100;像这种写法,也是野指针。

思考一下:

所以为什么说这样写int *p; *p = 100会变成野指针,而这样写char *s; s=”helloworld”就不是野指针?

int *p   //p里面保存的是随机值

char *s  //s里面保存的也是随机值

p和s都随机指向一块内存,这块内存不一定能用,一般都是不能用。

*p = 100   把100写入p指向的内存,这块内存不一定能用,所以段错误。

s = "helloworld" 把helloworld字符串的地址保存在s中

一个是把数据保存在指针指向的内存中,一个是把数据保存在指针中

为什么说s = "helloworld" 是把helloworld字符串的地址保存在s中,而不是说把字符串 "helloworld"保存在s中, "helloworld" 本身就是地址?

因为在C语言中,除了 char str[32] = "helloworld" 表示把helloworld放在数组中,其他情况,大部分都是把"hello world"当作一个地址用。s只占了4字节或者8字节,存helloworld也存不下

指针数组

int main()

{

char *string[ ]={”I love China!”,”I am ”};

printf("%s\n",string); //能打印输出来吗???

return 0;

}

以上这个string是数组还是指针?

我们从符号的优先级来判断,‘[ ]’的优先级更高(C语言中,一般来说,括号的优先级都比较高),那string先跟[]结合,再跟‘*’结合,那可以断定,string首先是一个数组,而且是一个字符数组。我们学过int型数组int a[ ],char型数组char a[ ],那char*型数组是什么呢?就是char*型的指针数组,意思是string是一个数组,而且里面保存的都是char*类型的指针。

打印字符串要跟上字符串的地址,如char s[ ]=helloworld; printf("%s\n", s);

所以如果我们想要打印这个第一个字符串的话,那就得跟上0x100,因为0x100是第一个字符串的地址。

因此得这样写才能打印:printf("%s\n",string[0]);

打印第二个字符串,就是:printf("%s\n",string[1]);

注:关于指针数组我们后面还会继续深入复习。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(Java)心得:LeetCode——18.四数之和

一、原题 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): …

【智能算法应用】基于果蝇算法-BP回归预测(FOA-BP)

目录 1.算法原理2.数学模型3.结果展示4.代码获取 1.算法原理 【智能算法应用】智能算法优化BP神经网络思路【智能算法】果蝇算法(FOA)原理及实现 2.数学模型 数据集样本特征数为13,适应度函数设计为: f i t n e s s e r r o…

推荐我常用的爬虫工具,三种爬虫方式,搞定反爬和动态页面

我和很多学python的同学聊过,至少有30%以上的人学Python是为了网络爬虫,也就是采集网站的数据,不得不说这确实是一个刚性需求。 但一个残酷的事实是,即使一部分人学了Python,掌握了requests、urllib、bs4等爬虫技术&a…

JUC下的Java java.util.concurrent.Locks详解

java.util.concurrent.locks 包介绍 java.util.concurrent.locks 包是Java并发编程中非常重要的一个部分,它提供了比内置synchronized关键字更为灵活的锁机制,用于多线程环境下的同步控制。这个包中最核心的是Lock接口,以及一系列实现类&…

整理好的中债国债3年期到期收益率数据集(2002-2023年)

01、数据简介 国债,又称国家公债,是由国家发行的债券,是中央ZF为筹集CZ资金而发行的一种ZF债券,是中央ZF向投资者出具的、承诺在一定时期支付利息和到期偿还本金的债权债务凭证。 中债,是指由中国中债登记结算有限责…

【ROS2】功能包

文章目录 ROS2 功能包创建功能包编译功能包设置环境变量功能包的结构C 功能包结构Python 功能包结构 参考链接 ROS2 功能包 在 ROS2 工作空间的 src 目录下进行编写的文件并不是普通的文件,而是被称作功能包。 创建功能包 Usage: ros2 pkg create --build-type …

【C/C++】内存分布

本文第一部分主要介绍了程序内存区域的划分以及数据的存储。第二部分有一段代码和一些题目,全面直观得分析了程序中的数组在内存中的存储。 因为不同的数据有不同的存储需求,各区域满足不同的需求,所以程序内存会有区域的划分。 根据需求的不…

线程同步--条件变量,信号量

生产者和消费者模型 案例 /*生产者消费者模型&#xff08;粗略的版本&#xff09; */ #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h>// 创建一个互斥量 pthread_mutex_t mutex;struct Node{int num;struct Node …

练习题(2024/5/12)

1二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…

异常处理/ROS2异常处理模块源码解读与浅析

文章目录 概述ros2/rcutils/src/error_handling模块自身异常处理错误状态结构与存储本模块初始化错误状态的设置错误状态的获取错误状态的清理不丢失旧错误状态把手段还原为目的其他 概述 本文从如下几个方面对 ROS2.0 中 rcutils 库 error_handling 错误处理模块的源码进行解…

day-34 二叉树的锯齿形层序遍历

思路 相较于二叉树的层序遍历&#xff0c;多了一个flag变量,当flag等于0时&#xff0c;把当前层的数组从左到右放入链表&#xff0c;当flag等于1时&#xff0c;把当前层的数组从右到左放入链表。 解题方法 注意&#xff1a;链表删除一个数据后会立即重排&#xff0c;所以删除同…

Linux进程控制——Linux进程终止

前言&#xff1a;前面了解完前面的Linux进程基础概念后&#xff0c;我们算是解决了Linux进程中的一大麻烦&#xff0c;现在我们准备更深入的了解Linux进程——Linux进程控制&#xff01; 我们主要介绍的Linux进程控制内容包括&#xff1a;进程终止&#xff0c;进程等待与替换&a…

GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))

1. GoF之代理模式&#xff08;静态代理动态代理(JDK动态代理CGLIB动态代理带有一步一步详细步骤)&#xff09; 文章目录 1. GoF之代理模式&#xff08;静态代理动态代理(JDK动态代理CGLIB动态代理带有一步一步详细步骤)&#xff09;每博一文案2. 代理模式的理解3. 静态代理4. 动…

函数式接口-闭包与柯里化

闭包 定义 示例 注意 这个外部变量 x 必须是effective final 你可以生命他是final&#xff0c;你不声明也会默认他是final的&#xff0c;并且具有final的特性&#xff0c;不可变一旦x可变&#xff0c;他就不是final&#xff0c;就无法形成闭包&#xff0c;也无法与函数对象一…

单链表经典算法OJ题---力扣206,876(带图详解

1.链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 思路&#xff1a;创建三个指针&#xff0c;看下图 注意&#xff1a;n3如果为空&#xff0c;则不能继续指向下一节点&#xff0c;需要进行判断 代码实现&#xff1a; struct ListNode* reverseLi…

手游掘金最新玩法,单条视频变现1w+,一部手机即可操作,保姆级教程

如果你也想通过手机赚钱&#xff0c;在这里有一个非常好的项目&#xff0c;它可以让你轻松赚到额外的收入。 这个手游掘金最新玩法&#xff0c;是一个非常受欢迎的项目&#xff0c;它可以让你通过制作单条视频来获得高额收益。不同于传统的游戏赚钱方式&#xff0c;这个方法不…

树莓派安装opencv

安装opencv 上述步骤完成后&#xff0c;输入以下代码(基于python3) sudo apt-get install python3-opencv -y不行的话&#xff0c;试试换源&#xff0c;然后 sudo apt-get update成功&#xff01; 测试opencv是否安装成功 输入 python3 然后再输入 import cv2 没有报错就…

闲来装个虚拟机Ubuntu24.04和硬盘分区及挂载

简述 最近ubuntu出新版本了&#xff0c;ubuntu24.04&#xff0c; 俗称高贵食蚁兽。5年前进行Android或者linux开发基本是在windows下的虚拟机中进行。目前&#xff0c;虽然物质基础提高了&#xff0c;功能有独立进行编译、代码管理的服务器了。可以通过ssh登录&#xff0c;但是…

[Bug]:由于中国防火墙,无法连接 huggingface.co

问题描述 : OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like youscan/ukr-roberta-base is not the path to a directory containing a file named config. Json. Checkout your internet …

【数据结构】排序(一)—— 希尔排序(思路演进版)

目录 一、常见的排序算法分类 二、常见排序算法的实现 2.1插入排序 2.1.1基本思想 2.1.2直接插入排序 思路 step1.单趟控制 step2.总体控制 代码实现 测试 特性总结 2.1.3 希尔排序( 缩小增量排序 ) 基本思想 思路演进 &#x1f308;1.代码实现单组排序&#…