万恶之源---指针<第四弹>

前言

在上一篇文章当中我们讲到了,如何限制变量,使其的值无法被改变,如何限制指针变量,使其只能存储一个地址或是无法通过解引用来访问其所指向的空间,不知道有没有戳中你的痛点呢?那么在本篇文章又能否再次为你带来惊喜呢?让我们拭目以待吧~~

1.指针运算

指针运算大概有三种,即:指针+-整数、指针-指针、指针的关系运算(比较大小)

1.1指针+-整数

在之前我们区分不同类型的指针的区别的时候就有所提及:

指针变量中存放的为指针,指针+-整数,其实为指针当中存放的地址跳过了(指针类型大小个字节)*整数以后得到的指针。

即:
p+i=p+i*(sizeof(p))
指针+- 整数的一点简单运用--->遍历数组

1.数组在内存为连续存放的(二维数组写成行与列的形式仅便于理解,上一行行末的元素的地址与下一行行首的地址是相邻的),有第一个元素的地址就能顺藤摸瓜的找到余下元素的地址

2.根据指针变量的特性,用int*类型的指针存放数组的首元素的地址。

=>第二个元素的首地址即为p+1

以此类推就能得到数组内每个元素的首地址。

例如,当我们打印一个长度为10的升序数组arr的时候

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* pa = &arr[0];//<==>arr,数组名即为数组首元素的地址
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(pa + i));
	}
		return 0;
	}

1.2|指针-指针|

|指针-指针|=指针之间这种元素的个数,即|地址之差|/sizeof(元素)

要想计算元素的个数,就要知道元素的类型,那么在两个地址之间存储的数据的类型就要统一。

故,|指针-指针|的前提即为:两块指针指向的为同一块空间(即在同一个数组的两个元素的地址相减,才知其之间的元素的个数)

为方便理解我们可以将之与日期相类比:

日期-日期=两个日期之间的天数(均已天为单位),日期+-天数=日期

1.3指针的关系运算

指针的关系运算,即为指针(地址)的比较大小(> < == >= <=)

#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int sz=sizeof(arr)/sizeof(arr[0]);
int*p=&arr[0];
while(p<arr+sz)//指针大小的比较
{
printf("%d ",p);
p++;
}
return 0;
}

2.assert断言(或宏)

assert()用于在运行的时候,确保程序符合指定条件,如果不符合就会报错,终止程序的运行。

assert宏定义在assert.h当中

assert(表达式);只要assert后方的表达式(只要为一个条件即可)结果为假,就会立即停止执行并打印出错的位置,若表达式的结果为真,那么assert没有任何反应

 某一条件不满足的时候不符合要求,即可以assert断言进行判断。

其次在确认程序无问题,不需要再做断言的时候,就在#include<assert.h>之前加一个宏NDEBUG即可使assert失效   (此时即使assert()中的表达式为假,也没有任何反应)

#define NDEBUG
#include<assert.h>

其实,assert相当于if语句,在assert在判断的之后会增加程序运行的时间。

所以,我们多在debug状态下使用assert,而在release(多会默认屏蔽)状态下禁用assert。

好了,今天的内容就到这里了,创作不易,欢迎大家点赞,收藏,关注❤

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小比特newer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值