c语言——指针(1)

1.内存和地址

1.在计算机中为了方便管理内存,内存会被划分为以字节为单位的内存空间,也就是说一个内存单元的大小是一个字节
为了方便找到这个内存单元,我们会给每个内存单元一个编号,就像生活中每个房间都有门牌号
有了内存单元的编号,就可以快速找到内存单元
所以我们可以理解为:
编号 =地址 =地址
在c语言中也被称为指针

2.指针变量和地址

2.1取地址操作符(&)

在C语⾔中创建变量其实就是向内存申请空间

#include <stdio.h>
int main()
{
 int a = 10;
 return 0;
}

在这里插入图片描述
可以看出a的地址为

0x006FFD70
0x006FFD71
0x006FFD72
0x006FFD73

那我们如何能得到a的地址呢?
使用一个操作符(&)-取地址操作符

#include <stdio.h>
int main()
{
 int a = 10;
 &a;//取出a的地址
 printf("%p\n", &a);
 return 0;
}

2.2指针变量和解引用操作符

2.2.1指针变量

变量创建的本质是:**在内存上开辟的空间**
int a=10;
要向内存申请4个字节的空间,存放数据10
&a;//&-----取地址操作符  
printf("%p\n",&a);
对于a来说,我们拿到的是a所占4个字节的第一个字节的地址(地址较小的那个字节的地址)
return 0;
int * ptr = &a; //ptr叫指针变量(因为是存放指针的变量,所以叫指针变量)
**指针变量就是用来存放地址的
存放在指针变量中的值,都会被当成地址使用**

2.2.1解引用操作符

只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,这⾥必须学习⼀个操作符叫解引⽤操作符(*)。

int main()
{
int a=10;
int * p = & a;
*p=0;//解引用操作符/间接访问操作符
//*p的意思是通过p中存放的地址,找到地址指向的空间,*p就是a
printf("%d\n",a)//结果为0;
return 0;    
}

这里*说明p是指针变量
p指向的对象是int类型的

2.3指针变量的大小

32位的机器上,有32根地址线,地址线上传输过了的电信号,转换成数字信号后,的32个0/1组成的二进制序列就是地址
地址都是32个0/1组成的二进制序列的话,那么存放这个地址需要空间大小就是4个字节所以指针变量的大小都是4个字节!
以下是在(86)的情况下运行的代码结果可以看出指针变量大小为4:
在这里插入图片描述

x86(32位)环境下为什么char的指针变量和int的指针变更量都是4个字节呢?是为了存放地址的,指针变量的大小是取决于存放一个地址需要多大的空间的!

X64环境,64位环境
64个地址线,地址就是64个0/1组成的二进制序列,要存放这样的地址,就需要8个字节所以指针变量的大小就是8个字节
以下是在(86)的情况下运行的代码结果可以看出指针变量大小为8:
在这里插入图片描述
指针变量的大小不是取决于对象,而是取决于存放的地址。
俗话说,不要在门缝里看人,把人看扁了
不要在门缝里看指针,把指针看扁了!!

3.指针类型的意义

3.1指针的解引用

对⽐,下⾯2段代码,主要在调试时观察内存的变化

int main()
{
	int n=0x11223344;
	int *p = &n;
	*p=0;
	return 0;
}

Alt

Alt

int main()
{
	int n=0x11223344;
	char *p = &n;
	*p=0;
	return 0;
}

在这里插入图片描述
在这里插入图片描述
可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第⼀个字节改为0
结论:
1.指针类型是有意义的
2.指针类型决定了指针在解引用操作的权限,也就是第一次解引用访问几个字节。
char类型的指针解引用访问1个字节,
int
类型的指针解引用访问4个字节

3.2 指针±整数

#include <stdio.h>
int main()
{
 int n = 0x112233344;
 int *p = &n;
 char *pc = &n;
 printf("p=%p\n", p);
 printf("p+1=%p\n", p+1);
 printf("%pc\n", pc);
 printf("%pc+1\n", pc+1);
 return 0;
}

调试时观察地址的变化
在这里插入图片描述
char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。
这就是指针变量的类型差异带来的变化
结论:
1.指针类型是有意义的
2.指针类型决定了,指针进行+1/-1操作的时候,一次跳过几个字节(指针的步长)
那么指针类型的这些特点,怎么使用呢?
如在数组{1,2,3,4,5,6,7,8,9,10}中
1.常规数组下标的方式访问
在这里插入图片描述

2.指针方式访问
在这里插入图片描述

4.const修饰指针

const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
但是指针变量本⾝的内容可变。
const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变。

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
sscanf函数是C语言中一个非常常用的函数,它可以将一个字符串按照指定的格式转换成相应的数据类型。在嵌入式开发中,sscanf函数也是非常常见的,因为很多时候需要从串口或者其他外部设备中读取数据,并将其转换成相应的数据类型进行处理。下面是一些sscanf函数的使用技巧: 1. 使用sscanf函数时一定要注意格式字符串的正确性。格式字符串中的占位符必须与待转换的数据类型相对应,否则会发生未知错误。 2. 如果待转换的字符串中包含多个数据,可以使用多个占位符进行转换。例如,如果待转换的字符串为"1,2,3",可以使用" %d,%d,%d"的格式字符串进行转换。 3. 可以使用sscanf函数的返回值来判断转换是否成功。如果返回值等于待转换字符串的长度,则说明转换成功,否则转换失败。 4. 如果待转换的字符串中包含浮点数,可以使用"%f"或者"%lf"的格式字符串进行转换。 5. 如果待转换的字符串中包含十六进制数,可以使用"%x"的格式字符串进行转换。 6. 如果待转换的字符串中包含字符或字符串,可以使用"%c"或者"%s"的格式字符串进行转换。 7. 如果待转换的字符串中包含指针类型的数据,可以使用"%p"的格式字符串进行转换。 总之,在使用sscanf函数时一定要注意格式字符串的正确性,否则很容易出现转换错误的情况。同时,还应该注意sscanf函数返回值的判断,以确保转换的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晓风飞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值