初阶指针-C语言

指针概念

指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。例如:一个房间的门口挂了房间号为2022,这个2022就是房间的地址,或者是2022"指向"这个房间。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
下面用代码看看:

#include<stdio.h>
int main()
{
	int a = 10;//在内存中开辟一块空间
	//这里我们对变量a,取出它的地址,可以使用&操作符。
	//将a的地址存放在p变量中,p就是一个之指针变量。
	int* p = &a;
	return 0;
}

在这里插入图片描述

通过监视窗口看出p存的是a的地址。
总结:

指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理),1个小单元是1个字节的大小。

32位的机器是如何编址的?
对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的是产生一个电信号正电/负电(1或 者0)
32根地址线就是:
在这里插入图片描述
也就是2的32次方,每个地址标识一个字节,那我们就可以给 (2^32Byte == 2^32/1024KB ==
232/1024/1024MB==232/1024/1024/1024GB == 4GB) 4G的空闲进行编址。
所以我们可以知道:
1.在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
2.那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地
址。总结:
指针是用来存放地址的,地址是唯一标示一块地址空间的。 指针的大小在32位平台是4个字节,在64位平台是8个字节。

指针类型

int main()
{
	int num = 10;
	int *p = &num;
	return 0;
}

这里除了int*,还可以是char*,short*,float*,double*,long*,指针的定义方式是: type + *。 其实: char* 类型的指针是为了存放char 类型变量的地址。short*类型的指针是为了存放 short 类型变量的地址。int*类型的指针是为了存放int 类型变量的地址。

指针类型的意义:

指针±整数
看一段代码:

int main()
{
	
	int n = 10;
	char* pc = (char*)&n;
	int* pi = &n;

	printf("%p\n", &n);
	printf("%p\n", pc);
	printf("%p\n", pc + 1);
	printf("%p\n", pi);
	printf("%p\n", pi + 1);
	return 0;
}

在这里插入图片描述
总结:
指针的类型决定了指针向前或者向后走一步有多大(距离)。

解引用

在这里插入图片描述
通过内存窗口看出int4个字节都改成了0,char是1个字节所以 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)

野指针

野指针概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。

造成野指针的原因

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;
    int i = 0;
    for(i=0; i<=11; i++)
   {
        //当指针指向的范围超出数组arr的范围时,p就是野指针
        *(p++) = i;
   }
    return 0; 
}

3.指针指向的空间释放

如何规避野指针

1.指针初始化 2.小心越界 3. 指针指向空间释放即使置NULL 4. 指针使用之前检查有效性

指针和数组

#include <stdio.h>
int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    printf("%p\n", arr);
    printf("%p\n", &arr[0]);
    return 0;
}

在这里插入图片描述

通过上面的可以得出:数组名就是数组首元素的地址

那么就可以用指针来访问数组
在这里插入图片描述

二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是 二级指针
在这里插入图片描述

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

*pi先找到p,在解引用找到就是a。

指针数组

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

int*arr3[5];

如下图:
在这里插入图片描述
其他的类型依次类推。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_End丶断弦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值