【超详解】浅入c语言指针剖析

众所周知,指针是c语言的精髓,甚至很多人说不会指针等于没学c语言,从此可见指针在c

语言中的地位与重要性。很多人也都说指针是c最难理解的一个部分,那么同样作为一名初学者,在此来交流自己对指针的想法与理解

1.指针的概念

Concept of Pointer is very similar to the concept of indirection(指针的概念类似于间接的概念)

for example:每个人都有一张身份证,那么通过调查这张身份证就可以查找出你是个怎么样的人。指针的概念就有点像这种间接的例子。

通俗的来讲在计算机中一个值都对应一个地址,那么这个地址就如同一个房子,这个房子里面存在一个住户,房子一旦建成那么它的位置不可改变,但是这个住户是可以改变的。

2.如何用指针

我们之前用的整数型变量int ,float, double ,后面跟着一个变量名,这个变量可以被赋值,同样也存在地址。

那么如何使用指针?如下图;

//如何定义指针!

int *p;

当定义了这种int型的指针时,我们称p是一个int类型的指针,*p则是取这个指针的值!

那么到底如何去理解这个指针呢?定义这个指针的意义在哪?

我们说当我定义了一个int *p,那么p就是int型的指针,那么对应之前的指针概念举例,那么它可以等效为我们的房子,与正常int型整数的地址是等效的,但是指针更加灵活多变!

从图中可以看出,当定义出一个指针,对于所有赋值的变化都发生在同一个地址中,大大提高了效率,节约了空间。一旦定义一个指针,那么如果不改变指针的话,指针所取的值都在一个指针中进行赋值改变!正如图中p一直保持100,而*p不断发生变化!

当了解了简单的指针架构后去对比一下int型整数,同样假设int t;那么t对应*p都是一个值(住户),&t则对应p 为一个地址\指针(房子),但是很大的不同是,&t一旦初始化是不能更改的,

只能是在这个指定的房子中改变t(也就是住户)。但是指针就有很大的灵活性!

#include<stdio.h>

int main()
{

int *p;
int t;
*p=8;
t=6;

p=&t;

printf("%p %p\n",p,&t);

printf("%d",*p);

return 0;
}

这里让p指针这个房子指向了&t这座房子!那么*p取的这个房子的住户,自然就是&t中的住户t了

所以上述程序的输出,p和&t的值相同,*p和t的值相同!  注:&t=p❌ &t这个房子不能改变!

3.指针的基本简单应用

swap函数是进行一个数的交换

直接用int类型作为传入函数的参数!

#include<stdio.h>

void swap(int a,int b)
{
	int t;
	t=a;
	a=b;
	b=t;
	
}

int main()
{
	int a,b;
	a=5;
	b=6;
	swap(a,b);
	
	printf("%d %d",a,b);
	return 0;
}

output:5 6

很显然并没有启到一个交换变量的作用!那么我们用指针来试试看:

#include<stdio.h>

void swap(int *a,int *b)
{
	int t;
	t=*a;
	*a=*b;
	*b=t;
	
}

int main()
{
	int *a,*b;
	*a=5;
	*b=6;
	swap(a,b);
	
	printf("%d %d",*a,*b);
	return 0;
}

output:6 5

ok!达到了预期的效果,实现了a与b值变量值的交换!

那么我们一起来解释这个指针应用成功的原因:

这里我们创造了两个指针变量a和b,然后把指针a和b传入到函数中,这里我们需要知道一个非常重要的概念!!!就是形参和实参!!在我们的主函数中swap(a,b)中的a,b是实际参数,那么当要传进函数中时,简单来说计算机会做这么一件事:先复制这个实际参数,这里便是a和b这两个指针(也可以理解为地址),那么在函数中*a和*b便是在这个复制的地址上做事情,说白了就是把这个房子的信息告知这个函数,那么被复制的信息就是形式参数,它只能接受到主函数中的信息,但是一旦离开函数重返主函数时,便会销毁这个形式参数,所以总结来说,形式参数本身在其他函数中的变化是不具有意义的!!所以我们在函数中不能进行之前说的地址交换从而交换房子里面的值。例如:

#include<stdio.h>

void exchange(int *a)
{
	int t=8;
	a=&t;
}

int main()
{
    int *a;
	*a=6;
	exchange(a);
	printf("%d",*a);	
	return 0;
}

output:6

我们发现这下*a的值并没有改变,这就是形参离开了函数会销毁所造成的结果:

但为什么我们在用指针的swap函数中实现了指针的交换呢?指针形参不是一样会被销毁吗?固然没错,但是我们在swap函数中可以看到,我们只是借用形参来确定房子,改变的是这个形参中的房子里面的住客,也就是*a和*b,我让*a和*b在确定的a和b的房子中进行交换,在完成交换后,不论a和b怎么变化,最后进行销毁都没有关系了,因为我以形参的形式传进来的实参的信息已经得到利用。所以回到主函数,*a和*b都会发生改变。

#include<stdio.h>

void exchange(int *a)
{
	*a=8;//相对于上面,多了这一步,结果就发生了改变
	int t=8;
	a=&t;
}

int main()
{
    int *a;
	*a=6;
	exchange(a);
	printf("%d",*a);	
	return 0;
}

output:8

 在计算机中编号为100的房子在exchange函数中改为了8,后面a发生变化都会被销毁,主函数中a仍然是100,所以对应100的房子住客就变成了8

那如果说我们偏要在函数中改变地址来交换变量呢?

#include<stdio.h>

void exchange(int **a,int **b)
{
	int t;
	t=*a;
	*a=*b;
	*b=t;
}

int main()
{
    int *a;
	*a=6;
	int *b;
	*b=5;
	exchange(&a,&b);
	printf("%d %d",*a,*b);	
	return 0;
}

output:5 6

很奇妙,竟然也成功的交换了,思路是:竟然如果我们传入地址是形参会被销毁,那么我们不妨传入地址的地址作为形参传入函数,那么*a和*b就是地址了,自然而然的可以发生变化,同时**a和**b更是绝对的安全了。这种思路也正是我前几天IP考试考到的题目,由于在自学指针的时候碰到这种问题,也产生过奇思妙想,没想到竟然考到了,确实有点突然的惊喜!

总结:指针的应用和介绍有很多,很多地方讲的很详细,这篇文章只是个人在自学指针时的一些思路与想法的分享。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

螺丝工人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值