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

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 9
max=9
min=4
sum=13
Press 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; //c
	return 0;    
 } 
注意分清定义时和使用时 cout<<**p<<endl; 所以*p 取得 “c++” 地址 (*name[] 为指针数组)**p 在*p基础上取内容为c。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值