《初始指针》

下面我将从

1、指针是什么

2、指针类型

3、野指针

4、指针运算

5、指针和数组

6、二级指针

7、指针数组

这几个方面大体讲一下今天的内容:

1、指针是什么

指针是个变量,使用来存放内存单元的地址(存放在指针中的值被当做地址来处理)

#include<stdio.h>

int main()
{
	int a=20;
	int* p=&a;
	printf("%p\n",p);
		return 0;
}

 上面的运行结果就是a的地址,而且我们可以看到a的地址是16进制,对于16进制两位就可以表示一个字节,所以该地址一共8个字节

这是因为指针大小在32位平台是4个字节,在64位平台是8个字节(对于这个的理解:在32位上地址位2^32,所以为4个字节,同理64位8个字节)

2、指针的类型

让我们先来看下面一段代码:

 由运行结果可以看不管是int*还是char*他们都可以存储a的地址,int的大小不是4个字节吗?char的大小不是1个字节码,而他们为什么都可以存储a的地址呢?

下面再让我们看一段代码:

 由上面的代码可以看出不管是什么类型的指针都是4个字节,这就是为什么char*完全可以存储a的地址了

那现在又有疑问了:既然这些指针的大小都一样,那他们的类型还有什么意义呢?、

这是因为指针的类型决定了指针进行解引用操作时,能够访问的空间大小(能操控几个字节)

int* p能够访问4个字节

char*  p能够访问1个字节

double* p能够访问8个字节

上面的代码可以看出:*p=0;可以使4个字节的a改变大小,而*j=0;却不能将4个字节的b变成0,就是因为j的类型是char*,他只能够访问b地址中的一个字节并将其改成0,但其他3个字节却不能改变

3、野指针

野指针就是指针指向的位置是不可知的(随机的、不正确的)

什么样的指针是野指针?

 在编写上述代码时没有给指针p赋初值,所以该指针所指向的空间是位置的,在运行程序的时候会出错

 当i=9时此时指针p指向arr[10]的地址,而当i=10时,指针就指向了arr[11],此时数组的下边越界,导致指针p所指向的空间是随机的

 上面这个代码也是野指针:因为在函数体中虽然返回了a的地址,但a是局部变量,所以在执行完函数后a的地址就会被释放,而在main中对p进行解引用,导致p所指向的空间是随机值

综上所述

1、指针未初始化

2、指针越界

3、指针指向的空间释放

都会造成野指针的出现,所以在用指针时,我们应该牢记:

1、指针初始化(如果不知道指针的初始值,就给其赋值NULL)

2、小心指针越界

3、指针指向的空间释放,就给其指针赋值NULL

4、指针使用之前检查有效性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值