【C语言学习记录】(六)——指针初级

本文介绍了C语言中的指针基础,包括指针的定义、指针类型及其作用,重点讨论了野指针的成因及避免方法,并涉及指针运算、指针与数组的关系,以及二级指针的概念。
摘要由CSDN通过智能技术生成

一、指针是什么?

  在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)电脑存储器中另一个地方的值。由于通过地址可以直接找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
                在这里插入图片描述
  我们把内存划分为一个一个的内存单元,取一个字节为一个基础的内存单元。同时为了能更好的管理这些内存单元,我们设置了编号,也称为内存单元的“地址”,如:0x00000001。因为地址指向这些内存单元,所以也把这些地址称为“指针”。

总结

1.指针是用来存放地址的,地址是唯一标识一块地址空间的。
2.指针的大小在32位平台是4个字节,在64位平台是8个字节

二、指针和指针类型

在这里插入图片描述
  我们发现不论指针是什么类型的,它都是占4个字节。但是我们不能建立一个通用指针,用一种指针类型表示所有的指针类型。那么指针的类型有什么用呢?
指针类型的意义:
1、指针类型决定了:指针解引用的权限有多大(能操作几个字节)。
  如:int类型指针解引用能访问4个字节,而char类型指针解引用只能访问1个字节,double类型指针解引用能访问8个字节。当你要从某一个地址向后访问一个整型的时候,我们最好拿一个整型指针int*来解应用,因为整型指针刚好能访问4个字节。
在这里插入图片描述在这里插入图片描述
  将数组arr的地址放到p和pc中,p是int*指针,pc是char*指针。arr是整型数组,放到p中是没有问题的,pc虽然是字符型指针,但是如果强行把arr的地址放进去也能存的下。所以不管写成什么指针,它里面都能存放地址。
在这里插入图片描述
  我们看到因为p和pc放的都是数组名,所以两者的地址是一样的。整型指针+1相当于跳过一个整型,p+1和p的地址会相差4个字节,所以p的地址会+4;而字符型指针+1相当于跳过一个字符,pc+1和pc相差1个字节,所以pc的地址会+1。
2、指针类型决定了:指针走一步能走多远,步长会是多长。
  如:double型的指针+1,地址会+8。p+1到底加几取决于p的类型,跟p指向的对象没有关系,跟p被赋予的值也没有关系。

三、野指针

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

1、野指针的成因:

(1)指针未初始化

int main()
{
   
	//这里的p就是一个野指针
	int* p;//p是一个局部的指针变量,局部变量不初始化的话,默认随机值
	*p = 20;//非法访问内存了
	return 0;
}

  p是一个局部的指针变量,放的是一个随机的地址。*p是对p进行解引用操作,访问p指向的地址,但是这个地址不一定是属于我们当前的程序。所以造成了非法访问内存。
在这里插入图片描述

这部分代码是无法正常运行的。

(2)指针越界访问

int main()
{
   
	//2、越界访问
	int arr[10] = {
    0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
   
		*p = i;
		p++;
	}
	return 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值