嵌入式全栈开发学习笔记---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]);

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

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

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

  • 32
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ARM Cortex-M3是一种广泛应用于嵌入式系统的32位处理器架构。NXP LPC1768是基于ARM Cortex-M3架构的一款微控制器,具有丰富的外设和易于使用的开发环境。 在使用NXP LPC1768进行嵌入式开发实例时,我们需要以下步骤: 1. 硬件准备:准备好NXP LPC1768开发板和必要的连接线材。将开发板连接到计算机,确保正确安装驱动程序。 2. 开发环境设置:ARM Cortex-M3开发使用Keil MDK软件包,下载并安装Keil MDK开发环境。将LPC1768相关文件添加到Keil MDK,并设置正确的编译和调试选项。 3. 编写代码:使用Keil MDK的集成开发环境,我们可以编写C或汇编语言程序来控制LPC1768的外设。例如,可以通过GPIO控制LED灯,通过UART与计算机通信等。 4. 编译和下载:通过Keil MDK编译代码,生成二进制文件。然后,使用编程器将二进制文件下载到LPC1768开发板上。 5. 调试和测试:使用Keil MDK的调试功能,可以在LPC1768上单步执行程序,观察变量的值和寄存器的状态,以确保程序正确运行。 6. 扩展功能:利用LPC1768的丰富外设,我们可以实现各种功能,如通过ADC读取模拟信号,使用PWM控制电机速度等。开发者可以根据具体需求进行相应的硬件和软件开发。 总的来说,ARM Cortex-M3嵌入式开发实例基于NXP LPC1768的开发,需要进行硬件准备、开发环境设置、编写代码、编译和下载、调试和测试等步骤。通过这些步骤,我们可以实现各种功能并开发嵌入式应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vera工程师养成记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值