C++ 指针 《C++ 程序设计》 -谭浩强 指针一章总结

来源:互联网 发布:收支记账软件 编辑:程序博客网 时间:2024/05/19 09:49

1.首先弄清两种访问方式:
1).直接存取(直接访问方式) :通过变量地址存取变量值
2).间接存取 :通过指针变量取得变量地址在存取变量值
两者区别如下图:

2.一个变量地址称为该变量的指针,变量的指针就是变量的地址(即对变量来说 指针=地址)。
  
用来存放变量地址的变量是指针变量
如上面只有int  * i_pointer   指向整形数据的指针变量。只有整型变量的地址才能被放到基类为整型的指针变量中。
下面对& * 运算比较模糊地方做一些说明:
1)

2)*&a 与a 等价。*&a与*pointer_1 等价。(已经执行了pointer_1=&a)(事实上有两种方式可以得到变量的值  1. [*+变量的地址]   2. 变量)。
3)看下面一个swap 函数

void swap (int *p1,int *p2){int *temp;*temp=*p1; //由于未对temp 赋值,因此temp 无确定单元值,也就是说temp 指向单元值是不可预见的。这种情况下对temp 赋值是有危险的,可能会破坏系统正常工作。执行报出现错误需要关闭。其实直接一个int temp 整形变量接收就可以了。没有给temp 分配空间不能访问 cout<<*temp<<endl,有异常temp 不知指向哪里。//如果先temp=p1;再*temp=*p1 就可以了。*p1=*p2;*p2=*temp;}
关于swap 函数和参数传值还是传引用 可以参考  http://blog.csdn.net/clam_clam/article/details/6661236 。

关于指针类型举例说明如下:
1) int (*p)[n]  不是指向一个整型元素而是指向一个包含n 个元素的一维数组。假设如果 p先指向a[0],则p+1不是指向 a[0][1] 而是指向a[1]。p的增值以一维数组长度为单位。
如下面程序:
int main(int argc, char* argv[])     { int a[2][3]={1,2,3,4,5,6}; int (*p)[3]=a; //int (*p)[2]=a; //cannot convert from 'int [2][3]' to 'int (*)[2]' int i=1,j=2; int b=*(*(p+i)+j); cout<<b<<endl; //6  return 0;     } 
2)int (*p)() 为指向函数的指针变量 其定义函数的指针变量方法为: 如下面函数
int max(int a,int b){if(a>b){return a;}else{return b;}}     int main(int argc, char* argv[])     {  int (*p)(int,int);//int *p(int,int) 格式为 函数返回类型 指针变量(参数类型,参数类型) p=max; cout<<p(4,6)<<endl;//输出6  return 0;     } 

C里可以用指向函数的指针作为参数而java 不行,java 屏蔽了指针(java 里只能用一个接口作为参数,来达到传递可变量函数的目的[接口类包含函数]-策略模式)。
看如下程序:

#include <iostream>using namespace std;int max(int x,int y){   printf("max=");return(x>y?x:y);}int min(int x,int y){    printf("min=");return(x<y?x:y);}int add(int x,int y){   printf("sum=");  return(x+y);}void process(int x,int y,int (*fun)(int,int)){  int result;   result=(*fun)(x,y);   printf("%d\n",result);}void main(){  int a,b;scanf("%d%d",&a,&b);int (*pFun)(int,int);pFun=max;process(a,b,pFun); //process(a,b,max);直接函数名也可以pFun=min;process(a,b,pFun);pFun=add;process(a,b,pFun);}
输入 4 9 
结果为:
4 9max=9min=4sum=13Press any key to continue
3) 注意别写成int * p(int int); //由于()优先级高于* 号,定义一个 返回 int 型指针的函数。如 http://blog.csdn.net/clam_clam/article/details/6889362 定义的就是返回int 型指针的fun 函数。定义形式为:类型名 *函数名(参数列表)。

int *p [n] 为指针数组  [] 比 * 优先级高所以首先是一个数组,然后与* 结合表明数组是指针类型的,每个数组元素都可以指向一个整形变量。
4.关于指针的指针
 int main(int argc, char* argv[])     { char **p;char *name[]={"basic","fortran","c++","pascal"};p=name+2;cout<<*p<<endl; //c++    cout<<**p<<endl; //creturn 0;     } 
注意分清定义时和使用时 cout<<**p<<endl; 所以*p 取得 “c++” 地址 (*name[] 为指针数组)**p 在*p基础上取内容为c。



原创粉丝点击