源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

基于指针的数据类型与指针运算小结

  • 时间:2020-11-02 22:30 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:基于指针的数据类型与指针运算小结
[b]1.指针的数据类型小结 [/b] 有关指针的数据类型
定义 含义
int i; 定义整形变量
int *p; 定义只想整型数据的指针变量p
int a[n]; 定义整形数组a,它有n个元素
int *p[n]; 定义指针数组p,它由n个指向整形数据类型的指针元素组成
int (*p)[n]; 定义指向n个元素的一位数组的指针变量
int f(); f为带回整形函数值的函数
int *p(); p为带回一个指针的函数,该指针指向整形数据。
int (*p)(); p为指向函数的指针,该函数返回一个整形数据
int * *p; p为一个指向指针的指针变量,它指向一个整形数据的指针变量
[b]2.指针的运算小结 (1)指针变量的赋值 [/b]
[u]复制代码[/u] 代码如下:
int a; int *p p=&a;
将变量a的地址赋给p
[u]复制代码[/u] 代码如下:
int a[3]={1,2,3}; int *p; p=a;
将数组首元素的地址赋给指针p
[u]复制代码[/u] 代码如下:
int a[3]={1,2,3}; int *p; p=&a[2];
将数组中的元素的地址赋给指针p
[u]复制代码[/u] 代码如下:
int main(){     int  f(int z);     int (*p)(int z);     p=f;     p(5); } int f(int z ){ cout<<z<<endl; }
f为已经定义的函数,将f的入口地址赋给p
[u]复制代码[/u] 代码如下:
int a=3; int *p1=&a; int *p2=p1;
p1和p2是同类型的指针,将p1的值赋给p2 [b](2)指针变量赋空值 [/b]指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:
[u]复制代码[/u] 代码如下:
p=NULL;
实际上NULL代表整数0,也就是使p指向地址为0的单元。这样可以使指针不指向任何有效的单元。 实际上系统已经定义了NULL:
[u]复制代码[/u] 代码如下:
#define NULL 0
C++中在iostream头文件中就包括了以上的NULL定义,NULL使一个符号常量。 在C-free编辑器中运行:
[u]复制代码[/u] 代码如下:
#include<iostream> using namespace std; int main(){  cout<<NULL;  cout<<endl; }
[img]http://files.jb51.net/file_images/article/201309/2013090210065118.jpg[/img] 应注意,p的值等于NULL和p未被赋是两个概念。前者是有值得(值为0),不指向任何变量,后者虽未对p赋值但并不等于p无值,只是它的值是一个无法预料的值,也就是p可能指向某一个未指定的单元。这种情况是非常危险的。因此,在饮用变量之前一定要对其进行赋值。 任何指针变量或地址都可以与NULL做相等或者不等的比较:
[u]复制代码[/u] 代码如下:
if(p==NULL)p=p1;
上面的语句还可以写成:
[u]复制代码[/u] 代码如下:
if(!p)p=p1;
还应注意 int *p=NULL;和int *p;*p=NULL;的区别: int *p=NULL是定义了一个指向整形变量的指针,并且对该指针进行了初始化操作,赋初始值为NULL; 而int *p;是定义了一个指向整形变量的指针,因为没有对该指针进行初始化,所以它可能指向任何一个值,因此可能指向一个非法的值,例如系统内存中的变量。 然后*p =NULL;是使p所指向的变量的值为0,因为p所指向的值是不确定的,所以该操作是十分危险的。 [b](3)指针变量的赋值应该注意的问题 [/b]我们知道基类型相同的不同的指针变量之间可以赋值。 不同的的基类型的变量之间是不可以进行赋值的。 运行代码:
[u]复制代码[/u] 代码如下:
#include<iostream> using namespace std; int main(){ <span style="white-space:pre"> </span>int *p1,i=5; <span style="white-space:pre"> </span>double *p2 ,j=2.5; <span style="white-space:pre"> </span>p1=&i; <span style="white-space:pre"> </span>p2=&j;  p1=p2;     cout<<*p1<<endl;     return 0; }
编辑器提示: [img]http://files.jb51.net/file_images/article/201309/2013090210065219.jpg[/img] 可以通过强制类型转化实现上述赋值:
[u]复制代码[/u] 代码如下:
#include<iostream> using namespace std; int main(){  int *p1,i=5;  double *p2 ,j=2.5;  p1=&i;  cout<<*p1<<endl;  p2=&j;  cout<<*p2<<endl;  p1=(int *)p2;     cout<<*p1<<endl;     return 0; }
虽然,上述操作不再报错,但是指针的强制类型转发生了数据截断,所以仍然得不到理想的结果: [img]http://files.jb51.net/file_images/article/201309/2013090210065220.jpg[/img] 关于指针的强制类型转换 [b](4)指针变量加/减一个整数[/b] 例如:
[u]复制代码[/u] 代码如下:
p++; p--; p+i; p-1; p+=i; p-=i;
C++规定,一个指针变量加/减一个整数是将该指针变量的原值(原来指向的地址)和它指向的变量所占用的内存单元字节数相加或者相减。 如p+i;代表这样的地址计算:p+i*d,d是p所指向的变量单元所占用的字节数。这样才能保证p+i指向p下面的第i个元素。 [b](5)两个指针变量相减 [/b]如果两个指针指向的同一个数组中的元素,则两个指针变量之差是两个指针变来那个之间的元素的个数。
[u]复制代码[/u] 代码如下:
#include<iostream> using namespace std; int main(){  int a[10]={1,2,3,4,5,6,7,8,9,10};  int *p1=&a[3];  int *p2=&a[5];  cout<<(p2-p1)<<endl;  cout<<(p1-p2)<<endl;  return 0; }
运行结果: [img]http://files.jb51.net/file_images/article/201309/2013090210065221.jpg[/img] [b](6)两个指针变量比较 [/b]若两个指针指向同一个数组的元素,则可以进行比较大小。指向前面元素的指针变量小于指向后面元素的指针变量。
[u]复制代码[/u] 代码如下:
#include<iostream> using namespace std; int main(){  int a[10]={1,2,3,4,5,6,7,8,9,10};  int *p1=&a[3];  int *p2=&a[5];  if(p1<p2){   cout<<"p1<p2"<<endl;  }else{   cout<<"p1>=p2"<<endl;  }  return 0; }
结果输出: [img]http://files.jb51.net/file_images/article/201309/2013090210065222.jpg[/img] 还可以利用这个性质,输出数组中的所有的元素:
[u]复制代码[/u] 代码如下:
#include<iostream> using namespace std; int main(){  int a[10]={1,2,3,4,5,6,7,8,9,10};  int *p=a;     while(p<a+10){      cout<<*p<<endl;      p++;     }  return 0; }
输出结果: [img]http://files.jb51.net/file_images/article/201309/2013090210065223.jpg[/img]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部