指针(2)

一、const对指针变量的修饰

用const修饰指针,放在*左边和*右边是不一样的。

1、左边

请看以下代码:

                

我们可以看到,在这段代码中,编译器给出了报错:

               

显然编译器认为p所指向的内容并不能通过*p来修改,那既然不能用*p来修改m的值,我们能不能干脆让p换一个指向变量呢?

#include<stdio.h>
int main() {
	int m = 10;
	int n = 20;
	const int* p = &m;
	p = &n;
	printf("%d", *p);
	return 0;
}

可以看到,指针变量p成功从指向m变为指向n。

因此,当const修饰在*左边时,表示不能通过指针来修改它所指向的变量的值,但是指针本身的内容可以被修改。

2、右边

请看以下代码:

       

                         

与上次不同,编译器认为不能将已经指向m的指针变量p重新指向n,但是通过指针变量p修改m的值是编译器所允许的。

            

m的值被成功修改了。

因此,当const位于*右面时,保证了指针变量本身的内容不能被修改,但是指针所指向的变量的内容可以被修改。

二、野指针成因

野指针成因有以下几点:

1、未对指针变量进行初始化,为随机值。

#include<stdio.h>
int main() {
	int* p;
	*p = 20;
	return 0;
}

2、越界访问

#include<stdio.h>
int main() {

	int arr[10] = { 0 };
	int* p = &arr[0];
	int i = 0;
	for (i = 0; i <= 11; i++)
	{
		//当指针指向的范围超出数组arr的范围时,p就是野指针
		*(p++) = i;
	}
		return 0;
}

3、指针所指向的空间已被释放

int* test()
{
	int n = 100;
	return &n;
}
int main()
{
	int* p = test();
	printf("%d\n", *p);
	return 0;
}

当函数被调用完成后,函数中的变量所占用的内存已被回收,此时p指向的内容是未知的。

三、如何规避野指针

1、及时对指针变量进行初始化。如果不知道指针该指向哪里,那就用NULL(空指针)进行初始化。如:

#include <stdio.h>
int main()
{
 int num = 10;
 int*p1 = &num;
 int*p2 = NULL;
 return 0;}

2、小心指针越界,不要超出访问范围。当指针不再使用时,及时置为NULL。

3、在函数中,避免返回局部变量的地址。

四、本章小结

1、当const修饰在*左边时,表示不能通过指针来修改它所指向的变量的值,但是指针本身的内容可以被修改。当const位于*右面时,指针变量本身的内容不能被修改,但是指针所指向的变量的内容可以被修改。

2、野指针的成因包括:未对指针变量进行初始化,越界访问和指针所指向的空间已被释放

3、为了避免野指针:及时对指针变量进行初始化,小心指针越界,避免返回局部变量的地址。

以上就是本章全部内容,如果你喜欢这篇文章的话,不要忘记点赞,收藏,关注哦!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值