您的位置:首页 > 编程语言 > C语言/C++

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 函数

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 continue
3) 注意别写成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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: