前言
在上一篇文章当中我们讲到了,如何限制变量,使其的值无法被改变,如何限制指针变量,使其只能存储一个地址或是无法通过解引用来访问其所指向的空间,不知道有没有戳中你的痛点呢?那么在本篇文章又能否再次为你带来惊喜呢?让我们拭目以待吧~~
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。
好了,今天的内容就到这里了,创作不易,欢迎大家点赞,收藏,关注❤