初级指针末尾(指针的比较,二级指针和多级指针)

前面我们学习了指针的加减法和野指针是什么和如何避免野指针的出现,接下来我们来介绍一下初级指针的最后一个点指针的比较和二级指针以及多级指针。

一.指针比较大小

如果大家看了上一篇的指针的加减法,我相信对于指针的比较也就没有那么奇怪了,那么指针是如何比较大小呢?下面我们首先写两个代码来给大家看一下指针的比较:

#define a 5
int main()
{
float arr[a];
float* vp;
for(vp=&arr[a];vp>&arr[0])
{
*--vp=0;
}
return 0;
}
#define a 5
int main()
{
float arr[a];
float* p;
for(p=arr[a-1];vp>=&arr[0];p--)
{
*p=0;
}
return 0;
}

认真观察我们不难发现出这两个代码之间的区别,第一个代码的“--”是在for循环内进行的这就是说明当--vp到arr【0】时则循环将不再进行也就是说代码不会向0方向越界,但是呢在刚开始给vp赋值的时候为arr【5】那么肯定就会有疑问了,这样不算越界吗。别慌我们先看第二个代码,那第二个代码呢刚开始赋值为arr【4】这样不会越界但它的p--是在循环外的,这样当arr为arr【0】时判断的那个过程会1变为&arr【0-1】去跟&arr【0】去比大小当然它是比&arr【0】小的,也就不满足循环的条件跳出循环。好了当我们知道了这两个代码的区别我们再来说一下这两种方式哪一种比较好一点。

其实第一种代码是要优于第二种代码的。

那么为什么呢?其实是因为在c语言的规定中为允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

也就是说假如有一个内存为5的数组这样就会有5个内存给这个数组

【-1】【0】【1】【2】【3】【4】{5}

在他们的地址进行比较时允许4跟5进行比较但不允许-1和0进行比较。

所以第一个代码是要优于第二个代码的,但是实际上在绝大多的编译器上这两种代码都是可以顺利完成任务的,然而我们还是应该要避免第二种这样的写法,因为标准并不保证它可行。

二.数组名称代表什么

在绝大多数的情况下数组名是首元素的地址但是也会有几个例外,分别是什么呢?

1.&数组名不是首元素的地址&数组名表示整个数组的地址下面我有几段代码给大家展示一下:

#include<stdio.h>

int main()
{
	char arr[5] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", arr + 1);
	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[0]+1);
	printf("%p\n", &arr);
	printf("%p\n", &arr+1);

	return 0;
}

有输出结果我们可以看出arr与arr【0】的输出结果相同并且他们的+1结果也是一样的,而&arr的输出结果和&arr+1的结果相差4(地址一般为16进制且A为10,B为10)由此我们可以得出&arr是代表整个数组的地址。

2.sizeor(数组名)计算的是整个数组的大小,这个应该大家都知道吧,这个就不在跟大家举例了。

三.二级指针以及多级指针

现在来到我们初级指针的最后一知识点二级指针,那么什么是二级指针呢?下面我们用一个代码来解释一下:

#include<stdio.h>

int main()
{

	int a = 10;
	int* p = &a;
	int* * pp = &p;
}

那我么的pp就是我们的二级指针了,它所存的是我们指针p的地址也就是存a地址的地址。那当然我们也可以通过pp来对我们的a进行修改**pp就可以对我们的a的内容进行修改啦。那自然int***ppp=&pp;就是我们的三级指针啦,那我相信四级指针还有五级指针大家就都掌握了吧。

四.指针数组

奥奥奥差点忘了还有一个指针数组报一丝哈,顾名思义指针数组它是一个数组但是他跟指针有关系哈。它是一个存放指针的数组下面给大家用一个代码解释一下:

#include<stdio.h>

int main()
{
	int i = 0;
	int a = 10;
	int b = 20;
	int c = 30;
	int* arr[3] = { &a,&b,&c };
	for (i = 0; i < 3; i++)
	{
		printf("%d ", *arr[i]);
	}
	return 0;
}

好了这就是我们的指针数组了,一个存放指针的数组,那么这个代码是否能顺利的将我们a,b,c的值打印出来呢?答案是肯定的啦!

看是不是顺利的打印出来了,好了这就是我们的指针数组了。

OK这就是我今天要给大家分享的内容如果大家喜欢的话可以关注一下!嘿嘿,我们一起学习一起进步白白啦!!

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值