博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C指针解析 ------ 指针的算术运算
阅读量:4602 次
发布时间:2019-06-09

本文共 1825 字,大约阅读时间需要 6 分钟。

       本文是自己学习所做笔记。欢迎转载。但请注明出处:

       指针是一个特殊的变量,表示一个地址,而地址能够上减去或加上一个整数,从而能够表示新的地址.

     以下通过一段代码来分析指针的算术运算: 

#include 
int main(){ int i; char str[]={'a','b','c','d','e'}; int *p = str; char *q = str; q++; p++; printf("数组str的首地址:%x\n",str); printf("指针q指向的内在区:%x\n",q); printf("指针p指向的内存区:%x\n",p); printf("数组的第一个元素的值:%c\n",*str); printf("数组的第一个元素的值:%c\n",*p); //遍历数组第一种方法,下标法 printf("遍历数组第一种方法,下标法:"); for(i = 0 ;i < sizeof(str);i++) printf("%c",str[i]); //遍历数组另外一种方法,数组名指针法 printf("\n遍历数组另外一种方法,数组名指针法:"); for(i = 0 ;i < sizeof(str);i++) printf("%c",*(str+i)); //遍历数组第三种方法,指针法 q = str; printf("\n遍历数组第三种方法,指针法:"); for(i = 0 ;i < sizeof(str);i++) printf("%c",*q++); }
    
运行结果:

         能够看出,数组的首地址为163c4730.通过上节的指针的概念和四个要素,非常easy得知,指针q的类型为char*,且指针q指向的类型为char; char *q = str;的作用是将数组str的首地址赋给指针q,也就是说指针q的值或q指向的内存区就是数组str的首地址. 接下来,指针q自加1,这时,编译器是这样处理的,它把指针q的值加上了sizeof(char),也就是在原来的地址的基础上向后移动了一个字节,即指针q的指向的内存区为163c4730+1=163c4731. 同理,指针p的类型为int*,且指向的类型为int,  int *p = str; 作用也是将数组的首地址赋给指针p,p++,编译器将把指针p的值加上了sizeof(int),也就是在原来的基础上向后移动了4个字节,即指针p指向的内存区为163c4734,所以指针p在自加前,是指向数组第0号单元開始的四个字节。在自加1后指向了数组第四号单元開始的四个字节。

        因此,推断指针向后移动的多少位时,须要推断指针指向的类型。

      

        也能够用指针来遍历数组,如上述代码,能够使用数组名,由于这里的数组名就是指向了数组的第0号单元,假设在此基础上加上一个偏移量,就能够訪问数组的其它元素。因此。能够用数组名+偏移量来遍历数组。同理,另设一个指针指向数组的第0号单元,每次指针自加1。就能够遍历整个数组,这里要注意,指针的所指向的类型。要和数组的元素类型要一致,所以上述代码中用指针q来遍历数组,而不是用指针p来遍历。

        当然,假设指针减去一个整数,处理过程和加上一个过程类似。仅仅是向前移动了。而不是向后移动。

        总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew。ptrnew的类型和ptrold的类型同样,ptrnew所指向的类型和ptrold所指向的类型也同样。

ptrnew的值将比ptrold的值添加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew。ptrnew的类型和ptrold的类型同样,ptrnew所指向的类型和ptrold所指向的类型也同样。

ptrnew的值将比ptrold的值降低了n乘sizeof(ptrold所指向的类型)个字节。就是说。ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

  

       

转载于:https://www.cnblogs.com/wzjhoutai/p/6777574.html

你可能感兴趣的文章
LINUX中搭建DNS服务器,实现正向、反向以及访问不同DNS解析
查看>>
SCCM2012 R2实战系列之十:解决WDS服务无法启动问题(错误1067:进程意外终止)...
查看>>
ubuntu 下安装 mysql
查看>>
关于k-means聚类算法的matlab实现
查看>>
Git分支2
查看>>
一键安装Gitlab后的备份、迁移与恢复
查看>>
因为本人工作繁忙,精力有限,本博客停止更新。有兴趣的博友可以关注我在CSDN上的主博客...
查看>>
SQL server查看触发器是否被禁用
查看>>
[C++基础]在构造函数内部调用构造函数
查看>>
跟随我在oracle学习php(8)
查看>>
Spring 3.1.0 Hibernate 3.0 Eclipse Spring WEB例子
查看>>
UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
查看>>
求两个集合的交集,并集,差集
查看>>
Kotlin的语法糖(一)基础篇
查看>>
OkHttp源码分析
查看>>
让你的app体验更丝滑的11种方法!冲击手机应用榜单Top3指日可待
查看>>
windows kernel exploitation基础教程
查看>>
NS_OPTIONS枚举的用法
查看>>
java9系列(九)Make G1 the Default Garbage Collector
查看>>
QAQ高精度模板笔记√
查看>>