初识指针中的易混淆点

探讨的问题

1.指针和指针类型
我们都知道指针是一个变量,是一个存放地址的变量。既然如此我们为何不单独定义一个类型呢?而是要用其他类型加星号来作为指针变量,有什么作用呢?
1.决定了指针的访问权限,也就是能访问几个字节。

int main()
{
    
    
	int a = 0x11223344;//一个十六进制位占4个比特位
	int *p = &a;
	*p = 0;
	return 0;
}

通过调试查看内存,可以看出a的内存是
在这里插入图片描述
当*p等于0的时候内存的变化,内存块里的4个字节全部变成0,

int main()
{
    
    
	int a = 0x11223344;//一个十六进制位占4个比特位
	/*int *p = &a;
	*p = 0;*/
	char *p = &a;
	*p = 0;
	return 0;
}

而当使用char类型的指针时,同样的地址,*p变成0之后,仅第一个字节变成0
在这里插入图片描述
由此可见,指针类型的作用有决定了指针的访问权限,也就是能访问几个字节。
2.指针决定了加减所走的距离。

int main()
{
    
    
	int arr[10] = {
    
     0 };
	int *p = arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
    
    
		*(p + 1) = i;
	}
	for (i = 0; i < 10; i++)
	{
    
    
		printf("%d ", i);
	}
	return 0;
}

arr数组中含有十个整型的空间,总共有40个字节,由于是Int类型的指针,每+1访问4个字节的空间,所以利用for循环可以填满arr数组。打印结果如下
在这里插入图片描述

int main()
{
    
    
	int arr[10] = {
    
     0 };
	char*pc = arr;
	int i = 0;
	for (i = 0; i < 40; i++)
	{
    
    
		*(pc + i) = 'x';
	}
	return 0
}

当我们用字符型的指针访问时,一个Char类型访问一个字节的内容,当我们填满arr时,需要40次循环填满。
2.野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
1.指针指向的空间释放

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

这个test函数传回来的地址没有意义,因为a是我们创建的临时变量,一旦脱离就消失了,所以这个p得到的地址指向的空间已经释放,称之为野指针。
2.指针越界访问
这个就是我们平常的数组,因为下标从0开始,所以定义数组的时候,个数所在的位置不能使用,称为越界。
3.指针的初始化

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

如果这样写是错误的,不能这样写。
指针的有效性
由于空指针不能访问,所以在每次使用之前我们要保证指针不等于空指针的时候再访问它,检查指针的有效性。

猜你喜欢

转载自blog.csdn.net/weixin_53831496/article/details/113276666