指针的算术运算
2014-05-25 19:25
302 查看
指针可以加上或减去一个整数的算术运算。
首先来看个例子:
程序输出的结果为:
分析上面的程序,我们可以看到,C++一般把数组名和第一个元素的地址等价,所以我们可以用上面的两种方法初始化指针,接着我们把pw加一,我们知道pw是一个指向double型的指针变量,从第二个pw的输出,得到地址值加了8个字节,于是输出的是数组第二个元素的值,接着也将ps加1,ps也指向了第二个元素,由于ps为指向short类型的指针变量,short占用2个字节,因此指针加1时,其值只增加2.接着后面的程序表明st[1]与*(st+1)都是表示数组st的第二个元素,即:C++中比较常用
arrayname[i]=*(arrayname+i);
pointername[i]=*(pointername+i);
数组名一般是常量,不能进行运算,而指针名一般是指针变量可以运算例如:pointername=pointername+1;
最后我们还可以发现,对数组引用sizeof运算得到的是数组的长度,而对指针应用sizeof得到是指针的长度,即使指针指向的是一个数组。
再看一个例子:
会发现3种方式输出的结果是一样的。
注意:指针变量加1后,其增加的值等于指向的类型占用的字节数。
总结
指针可以和整数进行加减运算,但是跟一般的加减运算不同,指针的加减运算跟指针的类型密切相关,例如,char型指针p和整数3,p+3表示p所指地址后面第3个字符的地址,p-3就表示p所指地址前面第3个字符的地址。给大家一个更直接的例子,有整型数组int a[5],p指向数组首地址a,则a+3表示首地址后第3个整数的地址,即a[3]。
“指针++”和“指针--”表示指针所指地址的下一个或前一个数据的地址。
指针的算术运算一般都是在操作数组的时候进行,因为只有声明数组才可以得到连续的内存空间。如果我们对一个单独的变量地址进行加或减的算术运算,然后改变新地址的值,则可能会破坏该地址的数据,所以在对指针进行算术运算时要明确运算的结果是程序中分配可用的地址。
指针的关系运算说的是相同类型的指针之间的关系运算。不同类型的指针之间的关系运算没有任何意义,指针和非0整数的关系运算也没有任何意义,但是指针可以和0进行关系运算,两个相同类型的指针相等,表示这两个指针指向同一个地址。
首先来看个例子:
#include <iostream> int main(void) { using namespace std; double wa[3]={1000.0,200.0,3000.0}; short st[3]={3,2,1}; double * pw=wa; short * ps=&st[0]; cout<<"pw= "<<pw<<", *pw="<<*pw<<endl; pw=pw+1; cout<<"add 1 to the pw pointer:\n"; cout<<"pw= "<<pw<<", *pw="<<*pw<<"\n\n"; cout<<"ps= "<<ps<<", *ps="<<*ps<<endl; ps=ps+1; cout<<"add 1 to the ps pointer:\n"; cout<<"ps= "<<ps<<", *ps="<<*ps<<"\n\n"; cout<<"access two elements with array notation\n"; cout<<"st[0]="<<st[0] <<", st[1]="<<st[1]<<endl; cout<<"access two elements with pointer notation\n"; cout<<"*st="<<*st <<", *(st+1)= "<<*(st+1)<<endl; cout<<sizeof(wa)<<"= size of wa array\n"; cout<<sizeof(pw)<<"= size of pw pointer\n"; return 0; }
程序输出的结果为:
分析上面的程序,我们可以看到,C++一般把数组名和第一个元素的地址等价,所以我们可以用上面的两种方法初始化指针,接着我们把pw加一,我们知道pw是一个指向double型的指针变量,从第二个pw的输出,得到地址值加了8个字节,于是输出的是数组第二个元素的值,接着也将ps加1,ps也指向了第二个元素,由于ps为指向short类型的指针变量,short占用2个字节,因此指针加1时,其值只增加2.接着后面的程序表明st[1]与*(st+1)都是表示数组st的第二个元素,即:C++中比较常用
arrayname[i]=*(arrayname+i);
pointername[i]=*(pointername+i);
数组名一般是常量,不能进行运算,而指针名一般是指针变量可以运算例如:pointername=pointername+1;
最后我们还可以发现,对数组引用sizeof运算得到的是数组的长度,而对指针应用sizeof得到是指针的长度,即使指针指向的是一个数组。
再看一个例子:
#include <iostream> using namespace std; int main() { int a[5]; int i; int *p; for(i=0; i<5; i++) cin>>a[i]; cout<<endl; for(i=0; i<5; i++) cout<<a[i]<<" ";//使用数组名和下标访问的方式访问数组进行输出 for(i=0; i<5; i++) cout<<*(a+i)<<" ";//使用数组名和指针运算访问的方式进行输出 for(p=a; p<(a+5); p++) cout<<*p<<" ";//使用指针变量访问的方式进行输出 return 0; }
会发现3种方式输出的结果是一样的。
注意:指针变量加1后,其增加的值等于指向的类型占用的字节数。
总结
指针可以和整数进行加减运算,但是跟一般的加减运算不同,指针的加减运算跟指针的类型密切相关,例如,char型指针p和整数3,p+3表示p所指地址后面第3个字符的地址,p-3就表示p所指地址前面第3个字符的地址。给大家一个更直接的例子,有整型数组int a[5],p指向数组首地址a,则a+3表示首地址后第3个整数的地址,即a[3]。
“指针++”和“指针--”表示指针所指地址的下一个或前一个数据的地址。
指针的算术运算一般都是在操作数组的时候进行,因为只有声明数组才可以得到连续的内存空间。如果我们对一个单独的变量地址进行加或减的算术运算,然后改变新地址的值,则可能会破坏该地址的数据,所以在对指针进行算术运算时要明确运算的结果是程序中分配可用的地址。
指针的关系运算说的是相同类型的指针之间的关系运算。不同类型的指针之间的关系运算没有任何意义,指针和非0整数的关系运算也没有任何意义,但是指针可以和0进行关系运算,两个相同类型的指针相等,表示这两个指针指向同一个地址。
相关文章推荐
- [C语言] 指针的算术运算
- 1. 指针的算术运算
- 指针的算术运算
- 指针运算——算术运算、关系运算
- 1. 指针的算术运算
- C指针解析 ------ 指针的算术运算
- 1)算术运算;2)指针地址操作;3)位运算 不使用第三方变量交换两个变量的值
- 指针的算术运算
- 基础之路02,C语言中的指针之间的算术运算
- 指针算术运算的实例化分析
- 指针的算术运算
- C++ 指针 (3)-算术运算
- 指针算术运算(指针 +- 数字,指针 - 指针)
- C语言指针的算术运算
- void * 指针算术运算【-Wpointer-arith】
- C++ 指针的算术运算
- C语言指针用法详解(二) 指针的算术运算
- C指针解析 ------ 指针的算术运算
- 指向指针C++ 指针 (3)-算术运算
- 第二章。指针的算术运算