8

室友一把吃鸡的时间带你拿捏C语言指针类型的意义

 2 years ago
source link: https://blog.csdn.net/weixin_53811859/article/details/122439575
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在这里插入图片描述
在这里插入图片描述

C语言指针类型的意义

一般情况下,可划分为两点:
1、指针±整数:指针的类型决定了指针向前或者向后走一步有多大(距离)。
2、指针的解引用:指针的类型决定了对指针解引用的时候有多大的权限(能操作几个字节)

接下来我将用代码举例子的形式来为大家讲解指针的这两个意义!

指针±整数

在这里插入图片描述
在这里插入图片描述
从代码演示中,我们可以清楚地观察到p1指针的最初位置为00B3F758(16进制表示,下同),p1指针+1以后,指针的位置变成了00B3F75C,这中间差了4个字节的大小;而p2指针的最初位置为00B3F740,p2指针+1以后,指针的位置变成了00B3F741,这中间差了1个字节的大小。
在这里插入图片描述
在这里插入图片描述
从代码演示中,我们可以清楚地观察到p1指针的最初位置为00EFFAC8(16进制表示,下同),p1指针+1以后,指针的位置变成了00EFFAC4,这中间差了4个字节的大小;而p2指针的最初位置为00EFFAB0,p2指针+1以后,指针的位置变成了00EFFAAF,这中间差了1个字节的大小。

实践是检验真理的唯一标准,你还可以用其他类型的指针继续尝试类似这样的操作,最终你会发现,指针类型的意义之一是:指针的类型决定了指针向前或者向后走一步有多大(距离)。

指针的解引用

在这里插入图片描述
在这里插入图片描述
打印出来的结果我们会惊奇的发现,为何sustain变量被指针变量p1重新赋值0后打印出来的结果就变成了0,而resource变量被指针变量p2重新赋值0后打印出来的结果依旧那么的大的数是1719109632,这究竟是为何呢?接下来我用他俩内存的变化来为大家讲解原因。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从代码内存的演示中,我们惊奇地发现指针p1和指针p2同时被解引用赋值为0的时候,指针p1一次性改变了4个字节的内存空间变化,而指针p2一次性改变了1个字节的内存空间变化,而p1对应的指针类型为int类型的指针,而p2对应的指针类型为char类型的指针,从而我们可以得出指针类型的意义之一是:指针的类型决定了对指针解引用的时候有多大的权限(能操作几个字节)。(实践是检验真理的唯一标准,你还可以多用其他的指针类型来进行类似的操作获取结论)

整体演示代码提取:

#define _CRT_SECURE_NO_WARNINGS 1

//#include<stdio.h>
//
//int main()
//{
//	int entertain = 0x11223344;
//	int *p1 = &entertain;
//	int retain = 0x66778899;
//	char *p2 = &retain;
//	printf("请看int*指针类型+1地址位置的变化\n");
//	printf("%p\n", p1);
//	printf("%p\n", p1 + 1);
//	printf("请看char*指针类型+1地址位置的变化\n");
//	printf("%p\n",p2);
//	printf("%p\n", p2 + 1);
//	return 0;
//}

//#include<stdio.h>
//
//int main()
//{
//	int entertain = 0x11223344;
//	int *p1 = &entertain;
//	int retain = 0x66778899;
//	char *p2 = &retain;
//	printf("请看int*指针类型-1地址位置的变化\n");
//	printf("%p\n", p1);
//	printf("%p\n", p1 - 1);
//	printf("请看char*指针类型-1地址位置的变化\n");
//	printf("%p\n", p2);
//	printf("%p\n", p2 - 1);
//	return 0;
//}

#include<stdio.h>

int main()
{
	int sustain = 0x11223344;
	int *p1 = &sustain;
	int resource = 0x66778899;
	char *p2 = &resource;
	*p1 = 0;
	*p2 = 0;
	printf("%d\n", sustain);
	printf("%d\n", resource);
	return 0;
}
newCodeMoreWhite.png

上述就是C语言关于指针类型意义的讲解,下篇文章将讲解的是C语言的野指针问题,欲知后事如何,请听下章分析!

楼主不才,不喜勿喷,若有错误或需要改进的地方,非常感谢你的指出,我会积极学习采纳。谢谢家人们一直以来的支持和鼓励,我会继续努力再接再励创作出更多优质的文章来回报家人们的。编程爱好的xdm,若有编程学习方面的问题可以私信我一同探讨(我尽力帮),毕竟“众人拾柴火焰高”,大家一起交流学习,共同进步!

在这里插入图片描述

2022.1.11


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK