变量存放在内存中分配的一个空间,指针指向变量所在的空间地址
int a;
int *p=&a;
其中int * 为指针类型,p为指针变量,存放地址,*p为该地址存放的数据;
当指针用于函数参数时,视为把变量地址传入函数。函数内直接通过地址找到要修改的存储位置,进行里面值的修改,因此函数内进行的修改是有效的。
例如通过函数实现2个值的交换
swap ( int a , int b )
{
int temp=a;
a=b;
b=temp;
}
调用此函数输出,无效;
通过指针可实现其效果:
swap ( int *a , int *b )
{
int temp=*a;
*a=*b;
*b=temp;
}
调用此函数,有效,main函数中进行调用
int main ( )
{
int x=3;
int y=2;
swap(&x, &y);
printf("x=%d y=%d\n",x,y);
return 0;
}
结果输出为x=2 y=3,此处函数参数传入的是地址值。
交换值的函数也有错误的写法
错误1:
swap ( int *a , int *b )
{
int *temp;
*temp=*a
*a=*b;
*b=*temp;
}
这种写法看似好像是没有错误,可是呢,犯了一个很容易被忽视的错误:指针没有初始化,此处temp没被初始化,temp中存放的地址是随机的,若该随机地址是系统工作区间,那就会出错(大概率事件)。修改:初始化temp;
错误2
swap ( int *a , int *b )
{
int *temp=a;
a=b;
b=temp;
}
此方法试图直接交换地址来交换值,然而此方法无效,两数的值并为交换,函数参数传入地址值,地址其实也是一个数字,ab的地址,两个数字产生副本,函数内只是交换两个副本值,如果这样,那就和上面第一个写法一样啦。
顺便再说引用:引用是c++里的,引用不产生副本,而是起别名,因此对引用变量的操作其实就是对源变量的操作,&引用并不是取地址,同一个粒子如下!
swap ( int &a , int &b )
{
int temp=a;
a=b;
b=temp;
}