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

学习内容

  1. 指针的作用
  2. *与&
  3. 多级指针
  4. 野指针
  5. 字符串

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

  • 谈谈你对指针的理解? (指针是什么)
    语法:指针是一种数据类型,它可以定义变量,变量保存的值是地址,由于地址是固定长度,所以指针变量的长度是固定长度;不同地址的步长不一样,需要不同指针类型的变量来保存;
    作用:由于指针变量可以保存地址,所以可以直接操作地址,也就是可以操作硬件的寄存器地址,从而实现直接访问硬件;
    支持的运算符:*:间接运算符, &:取地址运算符(对应内存空间和指向内存空间)
    在这里插入图片描述
    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()

编程练习

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


posted @ 2022-01-14 16:58  周末不下雨  阅读(41)  评论(0编辑  收藏  举报