指针内容全覆盖(这可能是你看到过最全面的指针讲解)

本文介绍了C语言中的指针基础知识,包括指针作为数据地址的概念,指针类型与指向类型的区别,以及如何使用指针。文中通过示例代码展示了指针在函数参数传递中的作用,以及如何避免野指针问题。此外,还探讨了指针的运算,如加减整数和指针关系运算。

在文章开始之前我们先声明,因为指针内容比较多所以我们打算使用三到四篇文章讲解完,

每篇文章会有对应的目录表明说明本文要讲的内容,方便读者直接看到。

目录

一、初始指针,指针的基本概念

二,指针的使用

三、野指针

四、指针的运算


一、初始指针,指针的基本概念

指针是c语言中的一种数据类型,指针常用来存放变量的地址,在对指针解引用时可以得到对应地址的变量。通俗点来讲可以把指针理解为我们家的门牌号,我们的家就是对应的数据

(1)、指针与指针类型

我们知道指针在定义时就决定了指针的类型,c语言中使用的专门来表示数据地址的一种数据类型就是指针的类型,常见的指针类型有int*,char*,short*,double*等

(2)、指针的指向类型

在使用指针时我们用指针来存储数据的地址,那么存储的数据的类型就是指针的指向类型,指针的指向类型有int 插入char short double float等。

指针的类型和指针的指向类型分别决定了指针的跨度和指针的宽度,这些内容我们会在后期提到。

二,指针的使用

在了解完指针的一些基本的概念之后,我们来学习指针应该如何使用

#include<stdio.h>
int main()
{
	int *p;
	int a=12;
	p=&a;
	printf("%d",*p);
	return 0;
 } 

这段代码就为大家展示了最基础的指针的使用,首先定义指针,指针中存放地址,输出指针解引用后的值。

这是指针最基础的使用,希望大家先了解

接下来大家再看一中指针的使用

#include<stdio.h>
void f(int *p); 
void g(int k);
int main()
{
	int i=6;
	 f(&i); 
	 g(i);
	
	return 0;
}
void f(int *p)
{
	printf("%d\n",*p);
	*p=26;
 } 
void g(int k)
{
	printf("%d\n",k);
}

输出的结果是6 26 

我们知道在函数体和主函数中参数的值应该是互不影响的,也就是两者之间本应该不会因一方的改变而改变,那么为什么这里会有影响呢?这就是指针的妙处所在,因为指针中存放的是地址,通过地址可以实现数据的互通,简单来说就是指针就相当于我们对游戏进行了存档,只要我们不存档就可以一直重来,但是一旦存档就变了,只能从存档段开始。

明白了以上内容之后我们再来一个指针的使用。

#include<stdio.h>
void minmax(int a[],int len,int *max,int*min);
int main()
{
	int a[]={1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55};
	int min,max;
	minmax(a,sizeof(a)/sizeof(a[0]),&max,&min);
	printf("%d%d\n",max,min);
	return 0;
}
void minmax(int a[],int len,int *max,int *min)
{
	int i;
	*max=*min=a[0];
	for(i=1;i<len;i++)
	{
		if(a[i]>*max)
		*max=a[i];
		if(a[i]<*min)
		*min=a[i];
	}	
}

我们用指针来实现minmax的寻找,这是有人就会发问,我们使用普通的程序找minmax不过几行代码,怎么使用了指针反而麻烦了? 

其实这段代码只是在给大家演示指针的一些用法和使用时要注意的点,并不是指针真正的妙用,随着我们文章的深入,大家会慢慢了解到指针原来可以这么吊

三、野指针

野指针就是指针指向的位置是不确定的随机的

(1)、形成原因

1.指针未初始化

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

这种就是最常见的指针未初始化代码段

2.指针越界访问,这种野指针通常要和数组联系起来

#include<stdio.h>
int main()
{
	int arr[10];
	int *p=arr;
	for(int i=0;i<11;i++)
	*(p++)=i;
	return 0;
}

这种就是指针越界访问的典型,指针指向数组,数组中有10个元素,但是指针却要访问11个地址,造成了访问的越界。

(2)、如何规避野指针

1.指针的初始化(通常我们在定义一个指针是会将其置空)

2.小心指针的越界

3.指针使用之前要检查指针的有效性

四、指针的运算

(1)、指针加减整数

此处就要应用我们在上文提到的指针的类型决定了指针的跨度,即指针加或者减一个数移动的距离有多大

这里我们可以明显的看出区别,char*型指针跨度就是1,int*型指针跨度就是4.

 这里的0x1实际上就是十进制中的1,从以上两个案例我们可以感受到指针加减整数后的变化

(2)、指针减指针

前提是两个指针应该指向同一个变量体

指针减指针得到两个指针之间的元素个数,

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

这就是指针减指针的典型应用。

(3)、指针的关系运算

指针的关系运算实际上就是两个或者多个指针之间地址的比较。

#include<stdio.h>
int main()
{
	int arr[5],i;	
	for(int*p=arr;p<=arr+4;p++)
	*p=0;	
	for(i=0;i<5;i++)
	printf("%d",arr[i]);
	return 0;
}

首先把数组的首地址存放进p中,如果p的地址比数组中第五个元素的地址小就进入循环,之后p+1向数组中第五个元素的地址逼近。

好了,以上就是我们本篇文章的全部内容,主要是指针的一些最基本的内容,谢谢大家的观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值