C++ 指针 《C++ 程序设计》 -谭浩强 指针一章总结
2011-10-25 21:48
232 查看
1.首先弄清两种访问方式:
1).直接存取(直接访问方式) :通过变量地址存取变量值
2).间接存取 :通过指针变量取得变量地址在存取变量值
两者区别如下图:
2.一个变量地址称为该变量的指针,变量的指针就是变量的地址(即对变量来说 指针=地址)。
用来存放变量地址的变量是指针变量。
如上面只有int * i_pointer 指向整形数据的指针变量。只有整型变量的地址才能被放到基类为整型的指针变量中。
下面对& * 运算比较模糊地方做一些说明:
1)
2)*&a 与a 等价。*&a与*pointer_1 等价。(已经执行了pointer_1=&a)(事实上有两种方式可以得到变量的值 1. [*+变量的地址] 2. 变量)。
3)看下面一个swap 函数
关于指针类型举例说明如下:
1) int (*p)
不是指向一个整型元素而是指向一个包含n 个元素的一维数组。假设如果 p先指向a[0],则p+1不是指向 a[0][1] 而是指向a[1]。p的增值以一维数组长度为单位。
如下面程序:
C里可以用指向函数的指针作为参数而java 不行,java 屏蔽了指针(java 里只能用一个接口作为参数,来达到传递可变量函数的目的[接口类包含函数]-策略模式)。
看如下程序:
结果为:
int *p
为指针数组 [] 比 * 优先级高所以首先是一个数组,然后与* 结合表明数组是指针类型的,每个数组元素都可以指向一个整形变量。
4.关于指针的指针
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 个元素的一维数组。假设如果 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 9 max=9 min=4 sum=13 Press any key to continue3) 注意别写成int * p(int int); //由于()优先级高于* 号,定义一个 返回 int 型指针的函数。如 http://blog.csdn.net/clam_clam/article/details/6889362 定义的就是返回int 型指针的fun 函数。定义形式为:类型名 *函数名(参数列表)。
int *p
为指针数组 [] 比 * 优先级高所以首先是一个数组,然后与* 结合表明数组是指针类型的,每个数组元素都可以指向一个整形变量。
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; //c return 0; }注意分清定义时和使用时 cout<<**p<<endl; 所以*p 取得 “c++” 地址 (*name[] 为指针数组)**p 在*p基础上取内容为c。
相关文章推荐
- C++程序设计(第三版)谭浩强 一章习题
- [C++程序设计]指针总结
- 谭浩强C++程序设计_指针习题11
- 谭浩强C++程序设计_指针习题13
- C++中值传递、指针传递、引用传递的总结(zz)
- 钱能C++程序设计教程第一版总结
- C++中值传递、指针传递、引用传递的总结
- C++ 程序设计(谭浩强)教材例题程序
- [C++程序设计]用指向数组的指针作函数参数
- 谭浩强C++程序设计第14章C++工具
- C++学习总结_为什么要使用指针
- c++程序设计梳理(谭浩强)9章
- C++指针之间的赋值与转换规则总结
- C++ 程序设计(谭浩强)教材例题程序
- [C++程序设计]指向数组元素的指针
- C++ 面向对象的程序设计 谭浩强 第一章 C++ 初步知识
- C/C++的一些关于字符数组和指针的小总结
- 谭浩强的C++程序设计书
- C++中值传递、指针传递、引用传递的总结
- C++中值传递、指针传递、引用传递的总结