嵌入式Linux C(五)——指针

简介: 嵌入式Linux C(五)——指针

学习内容


指针的作用

*与&

多级指针

野指针

字符串


一、指针(深入浅出指针)


谈谈你对指针的理解? (指针是什么)

语法:指针是一种数据类型,它可以定义变量,变量保存的值是地址,由于地址是固定长度,所以指针变量的长度是固定长度;不同地址的步长不一样,需要不同指针类型的变量来保存;

作用:由于指针变量可以保存地址,所以可以直接操作地址,也就是可以操作硬件的寄存器地址,从而实现直接访问硬件;

支持的运算符:*:间接运算符, &:取地址运算符(对应内存空间和指向内存空间)

0a2653c851af460fa595bd959398a8f1.png

num:整型变量

p:整型指针变量

*p:先取出p对应内存空间保存的地址,根据这个地址找到该地址对应的内存空间,取出这个内存空间的值;

p变量保存的是num的对应空间的地址;

所以:

num对应的内存空间就是p指向的内存空间

*p:取p指向空间的内存空间的值

p:p对应内存空间的值

(*p)++:对p指向的空间的值+1;

p++:对p对应空间的值加1;(int步长为4)

p == &num == 0x1000

*p == num == 5

*(&num) = 5


从右往左看

int * p//整型指针变量:p是一个变量,保存的是地址,该地址是整型类型

char * p2//字符指针变量:p2是一个变量,保存的是地址,该地址是字符类型的地址


问题:为什么地址分为不同类型?–》不同类型的指针变量保存不同步长的地址

地址属性:步长(做加1操作所移动的字节数)地址 + 操作数 - 地址 eg.0x00000001 + 1 = ????


二、多级指针


多级指针:保存上一级指针变量的地址;(远指针(巨指针),近指针)

提出问题:&p 如何保存?

int **pp://整型指针的指针变量:pp是一个变量,保存的是地址,该地址对应的内存空间保存的还是地址,这个地址是整型地址

pp的字节长度:32:4 64:8


pp == &p ==0x2000
*pp == p == 0x1000 = &num
**pp == *p == num
//类推


(场景应用:函数传参)


//例
void func(char **ptr)
{
  (*ptr)++;
}
int main()
{
  char *ptr = "hello world";
  func(*ptr);
  printf("ptr = %s\n",ptr);
  return 0;
}


三、指针运算、万能指针


指针之间的运算:

赋值:指针之间赋值(相同类型指针之间赋值):

短指针赋值给长指针:多取数据

长指针赋值给短指针:丢数据

同级指针相互赋值

注:void *:万能指针:可以接受任何类型指针的值

运算+:p + 操作数 指针 + 指针

运算-:p - 操作数 指针 - 指针:相差数据类型的个数



p指针的位置是存储在栈空间的,而指针p指向的空间是在堆上的


疑问及解决


问题1,对printf各种%的理解

网址:C 库函数 - printf()


编程练习


题目:一个字符串中连续最长数字字符串的个数并输出


相关文章
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
577 1
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
761 1
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
936 15
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
796 13
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
1235 3
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
**嵌入式Linux学习误区摘要** 1. **过度聚焦桌面Linux** - 许多学习者误将大量时间用于精通桌面Linux系统(如RedHat、Fedora、Ubuntu),认为这是嵌入式Linux开发的基石。 - 实际上,桌面Linux仅作为开发工具和环境,目标不应是成为Linux服务器专家,而应专注于嵌入式开发工具和流程。 2. **盲目阅读Linux内核源码** - 初学者在不了解Linux基本知识时试图直接研读内核源码,这往往导致困惑和挫败感。 - 在具备一定嵌入式Linux开发经验后再有针对性地阅读源码,才能有效提升技能。
322 4
|
物联网 Linux 芯片
学习嵌入式是选择单片机还是Linux?
单片机通常指的是一种集成了处理器、存储器和各种外设接口的微控制器芯片,常见的有STC、51系列、AVR、ARM Cortex-M等。单片机具有低成本、低功耗、实时性强等特点,适用于对资源要求较低、功耗要求较低、实时性要求较高的嵌入式系统。学习单片机开发可以让您深入了解嵌入式系统的底层原理和硬件编程,对于对嵌入式系统底层开发感兴趣的人来说,是一个很好的选择。
554 4
|
消息中间件 安全 Java
【嵌入式软件工程师面经】Linux多进程与多线程
【嵌入式软件工程师面经】Linux多进程与多线程
435 1
|
存储 缓存 Unix
【嵌入式软件工程师面经】Linux文件IO
【嵌入式软件工程师面经】Linux文件IO
331 1