本文是自己学习所做笔记,欢迎转载,但请注明出处: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所指向的类型)个字节。
分享到:
相关推荐
运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的调用与使用)等。 资料内容请详细查看,或者按资源名称搜索博文有...
指针的算术运算
指针的算术运算分析
指针的概念 指针的算术运算 运算&和* 指针表达式 数组和指针的关系 指针和结构类型的关系 指针的安全问题 指针的安全问题 指针的安全问题
指针的概念 指针的算术运算 运算符&和* 指针表达式 数组和指针的关系 指针和结构类型的关系 指针和函数的关系 指针类型转换 指针的安全问题 右左法则 要注意有些复杂指针声明是非法的
指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。指针加1的结果等于原来的地址值加上指向的对象占用的总字节数。指针的相减将得到一个整数,仅当两个指针指向同一个数组时这种运算才有意义,这将得到...
指针的值----或者叫指针所指向的内存区或地址 4指针本身所占据的内存区 2、指针的算术运算 3、运算符&和* 4、指针表达式 5、数组和指针的关系 6、指针和结构类型的关系 7、指针和函数的关系...
1、指针的概念 2、指针的算术运算 3、运算符&和* 4、指针表达式 5、数组和指针的关系
指针,算术,位移运算开发包部份示例代码[AsmInVB].
1.18 算术运算---------------------------------------------------------19 1.19 判断:相等与关系运算---------------------------------------------21 1.20 新型头文件与名字空间------------------------...
38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...
《c语言教程(原书第4版)》是一本优秀的c程序设计语言教材,完整描述了ansi c语言及其语法特性,并对c语言的高级特性和应用作了深入阐述,介绍了从c到c++和java过渡的相关知识。《c语言教程(原书第4版)》的一个...
掌握指针的赋值运算和算术运算;如何定义和调用以简单类型的指针作参数的 函数。 【重难点】 重点: 指针作参数的函数的定义和调用;指针下标的运算;指针与函数; 难点: 指针作参数的函数的调用;
接着,我们将深入探讨指针和数组,包括指针的基本概念、指针的算术运算、指针和数组的关系等等。然后,我们将介绍C语言中的结构体和联合体,以及这些数据类型在实际编程中的应用。此外,我们还将讲解C语言中的函数和...
一。指针的概念 二。指针的算术运算 三。运算符&和* 四。指针表达式 五。数组和指针的关系
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...
38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...
在C语言中,一种数据类型或数据结构往往占有一组连续的内存单元,用指针描述一个数据结构的首地址,该指针指向这个数据结构。 11.2 指向变量的指针 #include int main() { int i=1,*pi=&i; printf("%d",sizeof...
38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...
38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...