010 指针基础篇——“C”

前言

小留言:哈喽!来自CSDN的朋友们,本文是Fan——C语言学习之路的第9篇文章,希望我的文章可以给您带来一定的帮助!
在这里插入图片描述

什么是指针

指针是一个值为内存地址的变量。 平常口语中说的指针,其实是指针变量,指针变量是存放地址的变量。
int main()
{
	int a = 1;
	int* pa = &a;
	*pa = 10;
	return 0;
}

在这里插入图片描述

这里也可以观察到pa的值与&a的值相同,也就是pa的值为变量a的地址
而&pa是指针变量的地址,这里要注意区分。

(int)类型说明符表明了指针所指向的对象的类型,*表明声名的变量是一个指针变量。pa是一个指针,*pa指向的是int类型的数据。
指针的大小:指针在32位平台上是4个字节,在64位平台上是8个字节

指针与指针类型

指针类型决定了指针进行+1或-1操作的时候一步走多远

int main()
{
	int a = 10;
	char b = 'B';
	int* pa = &a;
	char* pb = &b;
	printf("%p\n", pb);
	printf("%p\n", pb + 1);

	printf("%p\n", pa);
	printf("%p\n", pa+1);
}

在这里插入图片描述

可以观察到,char类型一次跳过1个字节,而int类型一次跳过4个字节,这是由指针指向的数据类型所决定的。而非指针本身的字节数。

野指针

最常见的野指针是我们在定义指针的时候并未初始化
而野指针会给我们带来以下危害
程序崩溃:野指针指向的内存地址可能已经被其他程序或系统使用,如果程序试图访问这个地址上的数据,就会导致程序崩溃或者产生不可预知的结果。
数据损坏:野指针指向的内存地址可能已经被释放,如果程序试图在这个地址上写入数据,就会导致数据损坏。
安全漏洞:野指针可能被黑客利用,攻击者可以通过修改野指针指向的内存地址,来改变程序的行为或者获取敏感信息。
以下是常见的野指针问题

1、指针未初始化

int main()
{
	int* p;
	*p = 20;
	return 0;
}

析:就好比指针p(一个人)随意地找到一个停车位。但是呢这个停车位是专用的。p(解引用)直接又把专用停车位的警示牌给扔了,然后p = 20,即又把20(他自己的车)停了进去。
这里最大的问题不在于int* p,而是去解引用一个不属于程序的空间!

2、局部变量出了函数作用域就会销毁

int* test()
{
	int a = 10;
	return &a;				//a是局部变量随着程序而销毁
}
int main()
{
	int* p = test();      //接收a的地址,虽然指针p记录着这一块空间,但是已经不属于当前程序了,非法访问
	*p = 100;
	return 0;
}

指针p接收了a的地址,用指针p记录这一块空间,但是这一块地址已经不属于当前程序了,解引用时造成非法访问。
析:好比男女朋友分手后,保留着电话(这没问题即:用指针p记录a的地址),但是再打电话去骚扰对方(解引用并修改值)这就有大问题了。

指针运算

1、指针±整数 == 指针

int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	int len = my_strlen("abcdef");
	printf("%d", len);
	return 0;
}

这里利用指针达到计算字符串里字符个数,指针+1还是一个指针,只是这个指针指向下一个地址
在这里插入图片描述

2、指针±指针 == 整数

int my_strlen(char* str)
{
	char* start = str;		//记录字符串首字符即起始位置
	while (*str != '\0')	//当指针str指向'\0'结束
		str++;				
	return str - start;
}
int main()
{
	int len = my_strlen("abcdef");
	printf("%d", len);
	return 0;
}

在这里插入图片描述

小结

倘若本文有遗漏疏忽之处,还需要你指正,以便今后改进!祝你天天开心啦!欢迎到我的博客留言,我会尽力解答,希望能给你一些帮助!

posted @ 2023-06-12 23:35  Fan_558  阅读(4)  评论(0编辑  收藏  举报  来源