1.指针:允许直接获取和操纵数据地址,实现动态存储分配。
int *pi;
*pi=5;
上述代码是错误的,整数指针pi并没有指向实际的地址,赋的值不知道该放到哪里去。
2. 下面哪个能够成功实现两个数的交换。
1)void swap1(int a, int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
2)void swap2(int *a, int *b)
{
int *temp;
*temp=*a; //是拷贝而非指向
*a=*b;
*b=temp;
}
3)void swap3(int *a, int *b)
{
int *temp;
temp=a; //是指向而非拷贝
a=b;
b=temp;
}
4)void swap4(int *a, int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
5)void swap5(int &a, int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int m=1,n=2;
swap1(m,n);
swap2(&m,&n);
swap3(&m,&n);
swap4(&m,&n);
swap5(&m,&n);
}
swap1传的是值的副本,在函数体内被修改了形参a和b,a和b的值确实交换了,但它们是局部变量,不会影响到主函数的m和n。当函数生命周期结束时,a和b所在的栈也就被删除。
swap2传的是一个地址进去,在函数体内的形参a和b,是指向实际参数m,n地址的两个指针。但
int *temp;
*temp=*a;
是不符合逻辑的一段代码,int *temp;新建了一个指针但没有分配内存,temp=a;是拷贝不是指向,也就是把a所指向的内存里的值(也就是实参m的值)拷贝到temp所指向的内存里了(int *temp的确是不进行内存分配,于是在系统拷贝是会临时给一个随机地址,分配的随机地址是个意外,且函数结束后不收回,造成内存的泄露 )。
swap3不能实现,因为函数体内只是指针的变化,而对地址中的值却没有改变。
swap4可以实现两数的交换。它修改的是指针所指向地址中的值。
swap5与swap4类似,是一个引用传递,修改的结果直接影响实参。