指针
关于初始化
例如:
#include
int main(){
int i;
printf("%d\n",i);
return 0;
}
如果不赋值的情况下,运行结果会是一个垃圾值;
在Dev-C++中运行结果是0
在VC++6.0的编译环境下,会是一个很大的随机数
例如:
#include
int main(){
int *p; //定义一个指针变量,变量名为p,类型是int *
int i=5;
p=&i; //把i的地址放到变量p里面,指针变量进行初始化
printf("*p=%d,i=%d\n",*p,i); //*p:是取出以p变量内容为地址的那个变量,*p==i;
//scanf("%d",&i); //把i输入一个整数,放入i的内存单元当中;i是变量,把i的地址取出来,把整型变量放入地址当中
return 0;
}
指针变量一定要初始化
常见错误
#include
int main(){
int *p; //定义指针变量p
int i=5;
*p=i; //p的内容没有进行初始化,为一个垃圾值
return 0;
}
2. 指针变量没有进行初始化;等号两边变量的类型不一致
#include
int main(){
int *p; //定义指针变量p
int *q;
int i=5;
p=&i; //p变量指向i,由p可找到i
*q=p; //指针变量没有进行初始化;等号两边变量的类型不一致
//*q:int类型; p:int *类型
return 0;
}
#include
void swap(int i,int j);
int main(){
int a=2;
int b=5;
swap(a,b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
void swap(int x,int y){
int t;
t=x;
x=y;
y=t;
return;
}
值传递,互换的是swap函数中的a和b的值,也就是形参中的x和y的值
void swap(int x,int y){
因为是在函数内部定义的变量,是局部变量,运行结束后,swap中的空间被释放
相当于互换的是局部变量的内存空间,而不是主函数中的内存空间,只是进行了值传递
在局部变量中进行的任何操作对主函数没有任何影响
运行结果:a=2,b=5
没有进行交换
参数传递指针实现
#include
void swap(int*,int*);
int main(){
int a=2;
int b=5;
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
void swap(int *p,int *q){
int t;
t=*p;
*p=*q;
*q=t;
return;
}
主函数中
swap(&a,&b);
void swap(int *p,int *q){
p接收a的地址;q接收b的地址
*p是指以p变量内容为地址的变量的值,p变量存放i的地址
t=*p; //将a的值给t
*p=*q; //b的值给a
*q=t; //a的值给b
这里的*p相当于a
转化一下变为:只是传递地址
t=a;
a=b;
b=t;
#include
void swap(int*,int*);
int main(){
int a=2;
int b=5;
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
void swap(int *p,int *q){
int *r;
r=p;
p=q;
q=r;
return;
}
例如:
r=p; //p的内容给r
p=q;
q=r;
只是交换了指向
原来的q指向b,p指向a;
现在的q指向a,p指向b;
但是a和b的内容仍然没有改变,只是交换了指向
综上所述:要想通过函数改变这个变量的值,必须传入这个变量的地址,然后使用指针进行交换