C语言中用&运算符表示取变量的地址。例如变量x的地址可以表示为&x。指针变量P指向x,p=&x。
#include<stdio.h>
void swap(int *x,int *y);
void main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("&a=%x,&b=%x\n",&a,&b);
printf("调用前:a=%d,b=%d\n",a,b);
swap(&a,&b);
printf("调用后:a=%d,b=%d\n",a,b);
}
void swap(int *x,int *y)
{
int t;
printf("\n------swap------\n",x,y);
printf("x=%x,y=%x\n",x,y);
t=*x;
*x=*y;
*y=t;
printf("------swap------\n\n",x,y);
}
1、在程序中`swap(&a,&b);完成函数的调用,它将变量a和b的地址&a、&b作为实参传给子函数swap中的形参x,y,其参数传递为单向值传递,由于x和y是指针变量,所以传递后指针x中存放a的地址,即使x指向a,同理y中存放的为b的地址,使y指向b。
2、在子程序中执行交换语句中,通过指针x和y间接访问变量a和b。在子程序中执行了将a的值存入t中(通过指针x间接访问a);将b存入a中(通过指针y间接访问b)将t存入b中实现了a和b的值交换。
3、当子程序执行完,程序释放形参x,y和局部变量t的存储空间,返回主函数,主函数中变量a,b的值为交换后的结果。
指针变量的声明:基本类型 * 指针变量名
指针变量的定义包括三个内容
1、符号*:表示所定义的变量是指针变量。
2、指针变量名:同普通变量,应为合法标识符,编译时需要为其分配内存空间。
3、基本类型:指针变量所指向的数据类型。
例如:
int *p;//p是指向整型的指针变量。
double *q;//q是指向浮点型的指针变量。
指针变量的声明方式
int *p;
指针变量的初始化
当我们定义一个指针变量的变量后,第一次把变量的地址赋值给指针变量的过程称为指针变量的初始化。例如:int *p,x;p=&x;
int x,*p=&x;
int *p=&x,x`是错的。
变量x必须在指针变量p声明前声明。语句
指针变量的赋值,
1、对指针变量的赋值需要保持数据类型的一致。
例如:
float x;
int *p;
p=&x;//是错误的。
2、不能将一个常数值赋值给指针变量。
例如:
int *p;
p=3000;//错误,因为3000是整型常量,不是一个整数变量的地址。
3、指针变量可以被赋值为null或0。
例如:
int *p;
p=null;
p=0;
/*指针变量被赋值为null或者0时,称这样的指针为空指针,它不指向任何地址空间,但除了NULL和0外,其它任何常量都不能赋值给指针变量。*/
4、&取地址运算符,指针变量的存储单元中存放的是它所指向变量的地址,为指针变量赋值时应注意&后必须是已声明的变量名。
例如:
int *p;
p=&123;//错误,操作数为常量是错误的。
p=&(x+y);//错误,操作数为表达式是错误的。
5、允许使用赋值运算符进行指针的赋值运算,指针的赋值运算使两个指针指向同一个变量,但前提是两个指针必须具有同一个数据类型。
例如:
int *p,*q,x=5;
p=&x;
q=p;
q=p;//是将p所指向变量的地址赋值给q。
*q=*p;//是将p所指向变量的值赋值给q所指向的变量。
指针变量规则:
1、只有变量的地址才能存储在指针变量中。
2、对指针变量的赋值需要保持数据类型一致。
3、不要把常数和变量的值赋值给指针变量。
4、指针变量在引用前必须初始化。
5、只有相同的指针彼此可以相互赋值。