`
阿尔萨斯
  • 浏览: 4170259 次
社区版块
存档分类
最新评论

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.通过上节的指针的概念和四个要素,很容易得知,指针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语言程序设计--宿舍管理

    运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的调用与使用)等。 资料内容请详细查看,或者按资源名称搜索博文有...

    指针的算术运算.zip

    指针的算术运算

    指针的算术运算分析.zip

    指针的算术运算分析

    C语言指针学习总结 简单全面

    指针的概念 指针的算术运算 运算&和* 指针表达式 数组和指针的关系 指针和结构类型的关系 指针的安全问题 指针的安全问题 指针的安全问题

    深入理解C语言指针的奥秘.pdf

    指针的概念 指针的算术运算 运算符&和* 指针表达式 数组和指针的关系 指针和结构类型的关系 指针和函数的关系 指针类型转换 指针的安全问题 右左法则 要注意有些复杂指针声明是非法的

    指针算术

    指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。指针加1的结果等于原来的地址值加上指向的对象占用的总字节数。指针的相减将得到一个整数,仅当两个指针指向同一个数组时这种运算才有意义,这将得到...

    指针经验总结

    指针的值----或者叫指针所指向的内存区或地址 4指针本身所占据的内存区 2、指针的算术运算 3、运算符&和* 4、指针表达式 5、数组和指针的关系 6、指针和结构类型的关系 7、指针和函数的关系...

    初学者编程入门:C语言指针使用方法

    1、指针的概念 2、指针的算术运算 3、运算符&和* 4、指针表达式 5、数组和指针的关系

    wxh 指针,算术,位移运算开发包部份示例代码[AsmInVB].

    指针,算术,位移运算开发包部份示例代码[AsmInVB].

    C++大学教程

    1.18 算术运算---------------------------------------------------------19 1.19 判断:相等与关系运算---------------------------------------------21 1.20 新型头文件与名字空间------------------------...

    c语言难点分析整理,C语言

    38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    《c语言教程(原书第4版)》是一本优秀的c程序设计语言教材,完整描述了ansi c语言及其语法特性,并对c语言的高级特性和应用作了深入阐述,介绍了从c到c++和java过渡的相关知识。《c语言教程(原书第4版)》的一个...

    C++指针运指针与函数、数组

    掌握指针的赋值运算和算术运算;如何定义和调用以简单类型的指针作参数的 函数。 【重难点】 重点: 指针作参数的函数的定义和调用;指针下标的运算;指针与函数; 难点: 指针作参数的函数的调用;

    现代C语言核心特性解析,C语言编程与宠物狗互动案例分析.pdf

    接着,我们将深入探讨指针和数组,包括指针的基本概念、指针的算术运算、指针和数组的关系等等。然后,我们将介绍C语言中的结构体和联合体,以及这些数据类型在实际编程中的应用。此外,我们还将讲解C语言中的函数和...

    超强的指针精讲学习笔记

    一。指针的概念 二。指针的算术运算 三。运算符&和* 四。指针表达式 五。数组和指针的关系

    免费下载:C语言难点分析整理.doc

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    史上最强的C语言资料

    38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...

    11.第十一章 指针.txt

    在C语言中,一种数据类型或数据结构往往占有一组连续的内存单元,用指针描述一个数据结构的首地址,该指针指向这个数据结构。 11.2 指向变量的指针 #include int main() { int i=1,*pi=&i; printf("%d",sizeof...

    高级C语言详解

    38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...

    高级C语言 C 语言编程要点

    38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...

Global site tag (gtag.js) - Google Analytics