101-浅谈指针

指针是什么?

在计算机科学中,指针(pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能够找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为指针。意思是通过它能找到以它为地址的内存单元。

指针是一个变量,存放内存单元的地址

#include <stdio.h>
int main()
{
	int num = 10;
	int* p = &num;//对于变量num,取地址将它存放在指针变量p中。
	return 0;
}

指针就是一个变量,用来存放地址的变量(存在指针中的数据都被当做地址来处理)

指针的大小

#include <stdio.h>
int main()
{
	int num = 10;
	int* p = &num;//对于变量num,取地址将它存放在指针变量p中。
	printf("%d\n", sizeof(p));//打印指针的大小
	return 0;
}

在这里插入图片描述
指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台上是4个字节,在64位平台上是8个字节。

指针和指针的类型
char*
int *
short*
long*
float*
double*

不管什么类型的指针,在32位平台上是4个字节,在64位平台上是8个字节

指针±整数

#include <stdio.h>
int main()
{
	int n = 10;
	char* p1 = (char*)&n; //int的n强制转换为char型
	int* p2 = &n;
	printf("%p\n", &n);//%p打印地址
	printf("%p\n", p1);
	printf("%p\n", p1+1);
	printf("%p\n", p2);
	printf("%p\n", p2+1);
	return 0;
}

在这里插入图片描述
n和p1、p2的地址是一样的。而char型的 p1+1,地址向后走了1个字节。int型的p2+1,地址向后走了4个字节。
总结:指针的类型决定了指针向前或者向后走一步有多大距离

指针的解引用

//指针解应用
#include <stdio.h>
int main()
{
	int n = 0x11223344;
	char* pc = (char*)&n;
	int * pi = &n;
	*pc = 0;//解引用
	*pi = 0;
	return 0;
}

char * 的指针解引用就只能访问1个字节,而 int *的指针的解引用就可以访问4个字节。指针的类型决定了,对指针的解引用的时候有多大的权限(即:一次能访问多少字节)

野指针
野指针就是指针的指向方向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针原因
1、指针未初始化

#include <stdio.h>
int main()
{
	int * p;//局部变量未初始化,默认随机值
	*p = 20;
	return 0;
}

2、指针访问越界

#include <stdio.h>
int main()
{
	int arr[] = { 0 };
	int *p = arr;
	for (int i = 0; i <= 11; i++)
	{
		//当指针指向范围外,p就是野指针
		*(p + i) = i;
	}
	return 0;
}

在这里插入图片描述
虽然有的时候越界也不一定报错,因为系统对越界是抽查
规避野指针
1、指针初始化
2、小心指针越界
3、指针指向空间释放即使置NULL
4、使用前检查有效性
注意
在内存中,第一个字节空出来不使用,否则无法区分指针变量的有效位置还是初始化。全局变量和静态变量是会初始化的,默认初始化为0;其他变量不会初始化
二级指针
指针变量也是变量,是变量就有地址,指针变量的地址就可以存放在二级指针中。当然也存在三级指针、四级指针…

#include <stdio.h>
int main()
{
	int a = 120;
	int *p = &a;//存放a的地址
	int ** pp = &p;//存放一级指针p的地址
	int *** ppp = &pp;//存放二级指针pp的地址

	return 0;
}

一级指针的地址存放在二级指针中,二级指针的地址放在三级指针中,使用的时候,三级指针解引用找到二级指针。二级指针解引用找到一级指针,一级指针解引用找到这个数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林林林ZEYU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值