【C语言基础】指针(初阶)

本文介绍了C语言中指针的基础知识,包括指针的类型、指针类型的意义、野指针及其规避方法、指针-指针、二级指针和指针数组的概念。讨论了指针类型对指针移动步长的影响,以及如何防止野指针问题。

目录

1.指针的类型

2.指针类型的意义

3.野指针

3.1野指针形成的原因

3.2如何规避野指针

4.指针-指针

5.二级指针

6.指针数组


关于指针的概念以及指针的大小请看这篇博客:写文章-优快云博客icon-default.png?t=M1L8https://mp.youkuaiyun.com/mp_blog/creation/editor/122291428

1.指针的类型

我们都知道一个变量是有类型的,如int型、 char型、float型。那么一个指针是否有类型呢?

我们可以这样思考一下:指针是用来存储变量的地址的,变量有不同的类型,那存储他们地址的指针也应该有不同的类型。

答案确实这样,指针有不同的类型。例:

这些都是不同的指针类型。我们可以总结以下 变量的类型 + * 就是指针的类型。

它们都有什么含义呢? 其实也很简单,如char* arr1,它的意思就是 arr1这个指针变量指向的数据类型为char型,也就是说char*类型的指针存放的是char类型变量的地址。当然了我这里将它们都初始化成了空指针。

2.指针类型的意义

前面我们讲过一个指针的大小取决电脑,在32位平台上指针的大小为4个字节,在64位平台上指针的大小为8个字节。看到这里可能会产生疑问,既然指针的大小是相同的为什么还要分为不同的类型呢?其实这是有意义的,并且作用非常大,看下面的例子:

这里可以看到 pc 和  pr 储存的地址是相同的,但是他们的类型不同,pr是char*类型而pc是int*类型,由③和⑤可以看到将pc pr各加一,他们跳过的字节数不同。这就是指针类型的意义,指针类型决定了指针向前或向后走一步有多大距离,当然也决定了在进行指针解引用是访问字节的权限。

3.野指针

概念:野指针是指针指向的位置不可知(随机的、不正确的、没有明确限制的)。

3.1野指针形成的原因

1.指针未初始化

#include <stdio.h>

int main()
{
	int* p;//指针变量未进行初始化,变量里储存的地址是随机的
	*p = 20;
	return 0;
}

2.指针越界访问

#include <stdio.h>
int main()
{
	int arr[5] = { 0 };
	int* p = arr;
	for (int i = 0; i <= 5; i++)
	{
		*(p + i) = i;//当i=5是超出数组arr的范围,p就是野指针了
	}
	return 0;
}

3. 指针指向的空间被释放

#include <stdio.h>
int main()
{
	int* arr = (int*)malloc(10 * sizeof(int));//开辟一块空间
	free(arr);
	//把arr指向的空间释放掉,这时arr就指向未知,成为野指针;
	//正确做法是将arr置为为空 arr=NULL

	return 0;
}

3.2如何规避野指针

1.指针初始化

2.小心指针越界 

3.指针指向的空间被释放后置为空(NULL)

4.避免返回局部变量的地址

5.使用指针前检查有效性

4.指针-指针

当两个指针指向同一块空间时,指针减指针得到的是两个指针之间的元素个数。

 这里需要注意的是arr代表的是数组的首元素,如果要得到整个数组的地址需要在数组名前面加上&,即&arr。

5.二级指针

存放指针地址的变量就是二级指针

这里pp就是二级指针。我们都知道指针p解引用一次便可得到num的值,那么我们就能知道pp解引用一次找到的是p,接着我们在解引用一次就能找到num的值。

6.指针数组

指针数组是存放指针的数组。

我们知道 整形int arr[5] 里面的值都是int类型的值,那么 我们就能推出 int*p[5]里面存放的都是指针。

今天的分享就到这了,以上若有错误请各位大佬指正!!! 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值