指针的运算(萌新版)

前言

指针是作为c语言非常重要的一个内容,本人在学习的过程中总结了一点关于指针运算的内容分享给大家,内容偏基础,适合萌新参考

若有表述不准确或不当之处,敬请您不吝指正,我将诚挚接受并及时修正。


一、指针运算是什么?

实质:地址的运算
指针运算就是利用指针作为内存地址的载体,通过对其进行数学运算来改变或比较它们所指向的内存位置,从而实现对内存中数据的高效操作。常见有赋值、算数、关系运算。

二、算数运算

1.指针加减整数

+:p+n (指针向地址增大的方向移动n个数据,如0x0000到0xFFFF方向)
-:p-n(指针向地址减小的方向移动n个数据,和加法方向相反)

示例如下:

#include<stdio.h>
int main(int argc, char *argv[])
{
	int a = 10;
	double b = 3;
	int* p;
	double* q; 
	p = &a;
	q = &b;
	printf("%p %p\n", p, p+1);
	printf("%p %p\n", q, q+1);
	return 0;
}

运行,会看到类似下面的输出

0x……(中间省略具体地址)a0 0x……(中间省略具体地址)a4
0x……(中间省略具体地址)b0 0x……(中间省略具体地址)b8

可以看到,p和p+1的地址虽然移动1,但是相差4,这是因为int类型通常占用4个字节,同理,double类型占用8个字节,q与q+1则相差8,也就是说指针加减整数n实际就是移动了n个数据
也就是:p ± sizeof(p的类型)*n

2.指针与指针运算

指针相减

两个指针常见的有相减的运算,而且两个指针相减通常是指在同一数组或内存区域内的两个指针之间的相对距离计算,其结果不是地址!!!也不是地址量的差值

示例如下:

#include<stdio.h>
int main(int argc, char *argv[])
{
	int a[5] = {1,2,3,4,5};
	int *p, *q;
	p = a; //相当于&a[0],取首位地址
	q = &a[3];
	printf("%p %p\n", p, q);
	printf("%d %d\n", *p, *q);
	printf("%ld\n", q-p);
	printf("%ld\n", p-q);
	return 0;
}

结果是

0x……(中间省略具体地址)10 0x……(中间省略具体地址)1c
1 4
3
-3

p 指向数组 a 的第一个元素 a[0],其地址最后两位为 10。
q 指向数组 a 的第四个元素 a[3],其地址最后两位为 1c。(两者相差12字节)
*p 打印 p 指向的值,即数组 a 的第一个元素的值,为 1。
*q 打印 q 指向的值,即数组 a 的第四个元素的值,为 4。
q - p 计算两个指针之间的距离,即地址相差的元素个数,为 3。
p - q 同样计算两个指针之间的距离,但由于 p 在 q 的前面,结果为 -3。
可以看出,两者相减后不是等于地址量差12,而是数据个数3

指针++或指针- -

p++是先赋值再加1,++p是先加1再赋值。直接看下面示例

#include<stdio.h>
int main(int argc, char *argv[])
{
	int a[5] = {1,2,3,4,5};
	int *p, *q;
	p = a; //相当于&a[0],取首位地址
	printf("%p %d\n", p, *p);
	q = p++;
	printf("%p %d\n", p, *p);
	printf("%p %d\n", q, *q);
	return 0;
}

直接看结果

0x7ffec9a47000 1
0x7ffec9a47004 2
0x7ffec9a47000 1

显然可以看出q是p加1之前的效果,因此第三排和第一排的输出一样。如果换成q = ++p,则第三排和第二排输出就一样。p- - 和 - -p差不多同理,就不细说了。


3.指针的关系运算

两指针之间的关系运算表示它们指向的地址位置之间的关系。指向地址大的指针大于指向地址小的指针。可以和0进行等于或不等于运算,来判断指针是否为空。
通常用来判断位置

三、指针运算的意义

个人觉得用来处理数组很不错,当然不否认后续还有很多方面都会用。


总结

就大致介绍一些指针运算相关的基础知识吧,作为本人第一次写博客的记录^ ^

相关推荐

  1. 指针运算新版)

    2024-03-27 17:24:10       41 阅读
  2. 指针运算

    2024-03-27 17:24:10       44 阅读
  3. C语言指针数组 指针运算

    2024-03-27 17:24:10       72 阅读
  4. C 指针算术运算

    2024-03-27 17:24:10       44 阅读
  5. 大数指数运算

    2024-03-27 17:24:10       33 阅读
  6. C++入门【20-C++ 指针算术运算

    2024-03-27 17:24:10       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 17:24:10       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 17:24:10       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 17:24:10       87 阅读
  4. Python语言-面向对象

    2024-03-27 17:24:10       96 阅读

热门阅读

  1. SpringMVC运行原理

    2024-03-27 17:24:10       39 阅读
  2. 函数模板案例---选择排序算法

    2024-03-27 17:24:10       36 阅读
  3. 记录一次AP重置经历

    2024-03-27 17:24:10       42 阅读
  4. Windows安装electron卡住报错的问题

    2024-03-27 17:24:10       43 阅读
  5. ruoyi-ui(前端文件夹)

    2024-03-27 17:24:10       38 阅读
  6. 需求工程、需求规格说明的具体方式以及实践

    2024-03-27 17:24:10       41 阅读
  7. 蓝桥杯备赛心得

    2024-03-27 17:24:10       46 阅读
  8. DevOps是什么

    2024-03-27 17:24:10       37 阅读