C指针解析 ------ 指针的算术运算
本文是自己学习所做笔记。欢迎转载。但请注明出处:http://blog.csdn.net/jesson20121020
指针是一个特殊的变量,表示一个地址,而地址能够上减去或加上一个整数,从而能够表示新的地址.
以下通过一段代码来分析指针的算术运算:
#include <stdio.h>
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所指向的类型)个字节。
C指针解析 ------ 指针的算术运算的更多相关文章
- C指针解析 ------ 运算符&和*
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 & 是取地址运算符.* 叫做指针运算符或间接运算符.&a 的运算 ...
- 02深入理解C指针之---指针类型和值
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 1.指针的类型: 可以在声明指针时,指定指针的类型,例如: (1)void *x 声 ...
- 承诺c指针 (1)指针是地址
(1)是地址 首先明白一个观点:指针就是地址.这是理解指针的起始一步. 直观感受下.变量的地址 int main() { int foo; int *foo_p; foo = 5; foo_p = & ...
- C++树的插入和遍历(关于指针的指针,指针的引用的思考)
题目 写一个树的插入和遍历的算法,插入时按照单词的字典顺序排序(左边放比它"小"的单词,右边放比它"大"的单词),对重复插入的单词进行计数. 程序源码 #inc ...
- 数组指针与指针数组(good)
数组指针和指针数组的区别 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p ...
- C 指向指针的指针
#include <stdio.h> int main() { char *cBooks[] = { "C程序设计语言", "C专家编程", &qu ...
- 让你不再害怕指针——C指针详解(经典,非常详细)
http://blog.csdn.net/soonfly/article/details/51131141 前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理 ...
- 00深入理解C指针之--- 指针之外
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. C语言从诞生之初就非常善于和硬件打交道,经过这么多年的发展之后,其灵活性和超强的特征是 ...
- C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数
1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...
随机推荐
- 谷歌浏览器cookies管理插件:EditThisCookie
目前大多数网站的登录程序或者是其他保存用户信息到本地浏览器的方式都是使用cookies的方式,而cookies虽然可以为用户的一些操作带来便捷,比如可以记住用户的密码或者用户的选择历史,在下一次操作的 ...
- Requirement Analysis
BRD:Business Requirements Document,商业需求文档.这是产品声明周期中最早的问的文档,再早就应该是脑中的构思了,其内容涉及市场分析,销售策略,盈利预测等,通常是和老大们 ...
- 前端JavaScript实现跨域的方式(转)
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- Request.Url.Port 获取不到正确的端口号
今天遇到一个很奇怪的事情,用request.url.port来获取一个请求的端口,返回是80 ,很纳闷啊我的请求上面是http://www.XX.com:8088 啊,怎么会是80啊,太不可思议了! ...
- DateFormatUtil格式化时间
package org.xiaowu.json.demo; import java.util.Calendar; import java.util.Date; import org.apache.co ...
- django前后端数据传输学习记录
在开发过程中会遇到这样的情况 后台返回了一堆的数据,是一个列表 例如 datas = [{"a":1, "b":2}, {"c": 3,&q ...
- 【共享单车】—— React后台管理系统开发手记:员工管理之增删改查
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- 2017.4.18 慕课网-spring事务管理总结
1.课程目标 事务回顾 spring中的事务管理的api spring中编程式事务管理 spring中声明式事务管理 2.事务回顾 2.1 事务的概念 事务是指逻辑上的一组操作,要么全成功,要么全失败 ...
- 资深程序员教你如何实现API自动化测试平台!附项目源码!
原文链接: 1.平时测试接口,总是现写代码,对测试用例的管理,以及测试报告的管理持久化做的不够, 2.工作中移动端开发和后端开发总是不能并行进行,需要一个mock的依赖来让他们并行开发. 3.同时让自 ...
- Node.js 极简入门Helloworld版服务器例子
粗浅得很,纯属备忘. // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http"); ...