指针变量(地址变量)是指专门用于存放变量的地址(即指针)的变量,其值是地址。
指针变量的定义:
类型名 *指针变量名;
//pointer_1,pointer_2指向int整型变量的指针变量,简称int指针
//左端的int是在定义指针变量时必须指定的“基类型”,基类型是用来指定此指针变量可以指向这些类型变量的指针
int *pointer_1,*pointer_2;
//可以在定义指针变量的时,对它进行初始化
//定义指针变量pointer_1.pointer_2,并分别指向a,b
int *pointer_1 = &a,*pointer_2 = &b;
在定义指针变量时的几点注意事项;
1.在定义指针变量时,指针变量前“”表示该变量的类型为指针型变量,指针变量的名为pointer_1,pointer_2,而不是pointer_1,*pointer_2;
2.在定义指针变量时必须指定基类型
有的人可能会认为既然指针变量是存放地址的,那么只需要指定它为“指针型变量”就可以了,为什么还要指定其基类型呢?
众所周知,不同类型的数据在内存中所占的字节数和存放方式是不同的,如果想通过指针引用一个变量,只知道地址(如2009)是远远不够的,因为无法判定是从地址为2000的一个字节中取出一个字符数据,还是熊2000和2001两个字节中取出short型数据,还是从2000到2003四个字节中取出1个int或者float型数据。因此,必须知道该数据的类型,才能按存储单元的长度以及数据的存储形式正确地取出数据。
3.指针变量中只能存放地址(指针),不要将一个整数赋给指针变量;
pointer = 100; //此语句不合法
//代码愿意是想将地址100赋给指针变量pointer,但是系统无法判别他是地址,从形式上看100是整常数,而整常数只能赋给整型变量int,不能赋给指针变量。
怎样引用指针变量:
在引用指针变量时,主要有有3种情况,
(1)给指针变量赋值
pointer = &a;//把a的地址赋给指针变量pointer,指针变量pointer的值时变量a的地址,pointer指向a
(2)引用指针变量指向的变量
pointer = &a; //指针变量pointer指向了整型变量a
printf("%d",*pointer); //输出指针变量pointer所指向变量的值,即变量a的值(*pointer等价于a)
*pointer = 1; //将整数1赋值给指针变量pointer所指向的变量的值,即相当于把1赋值给a,等价于“a = 1”
(3)引用指针变量的值
printf("%o",pointer);//以八进制数形式输出指针变量pointer的值,即a的地址(&a)
总而言之,两个有关的运算符:
(1)&:取地址运算符,&a是变量a的地址;
(2)*:指针运算符(或“间接访问”运算符),*pointer是指针pointer指向的变量
代码示例:
//要求:输入两个整数,按先后大小顺序输出
int *pointer1, *pointer2, a, b;
printf("please enter two integer number:\n");
scanf_s("%d%d",&a,&b);
pointer1 = &a;
pointer2 = &b;
if (a<b)
{
int *pointer;
pointer = pointer1;
pointer1 = pointer2;
pointer2 = pointer;
}
printf("max = %d,min = %d",*pointer1,*pointer2);
system("pause");
return 0;
指针变量做函数参数
函数的参数可以是指针类型,他的作用是将一个变量的地址传递到另一个函数中。
在C语言中实参变量与形参变量之的数据传递是单向的“值传递”方式,用指针变量做函数参数时同样要遵循这一原则,不可能通过调用函数来改变实参指针变量的值(就是说不能改变实参的地址),但可以实参指针变量所指变量的值(可以改变内存单元的内容)。
//不能通过调用函数来改变实参指针变量的值(不能通过形参地址的改变来是实现实参地址的改变)
int main(void)
{
void swap2(int *pointer_1, int *pointer_2);
int a, b, *pointer1, *pointer2;
printf("enter a and b:\n");
scanf_s("%d%d", &a, &b);
pointer1 = &a;
pointer2 = &b;
if (a < b)
swap2(pointer1,pointer2);
printf("Mmax = %d,Mmin = %d\n", a, b);
system("pause");
return 0;
}
void swap2(int *pointer_1, int *pointer_2)
{
int *temp;
temp = pointer_1;
pointer_1 = pointer_2;
pointer_2 = temp; //形参指针变量pointer_1、pointer_2的值(即地址)对调
printf("Smax = %d,Smin = %d\n", *pointer_1, *pointer_2);
}
//但是形参指针变量所指变量的值发生了改变,那么在主调函数中可以使用这些改变了的值
int main(void)
{
void swap(int *pointer_1,int *pointer_2);
int a, b, *pointer1, *pointer2;
printf("please enter two integer numbers:\n");
scanf_s("%d,%d", &a, &b);
pointer1 = &a;
pointer2 = &b;
if (a < b)
swap1(pointer1,pointer2);
printf("max = %d,min = %d\n",a,b);
}
void swap1(int *pointer_1, int *pointer_2)
{
int temp;
temp = *pointer_1;
*pointer_1 = *pointer_2;
*pointer_2 = temp;
//形参指针变量pointer_1\pointer_2的值(即地址)没有发生改变,但是他们指向地址中内容发生了改变(实参指针变量也
//指向这些地址)
}
//特殊情形:
void swap1(int *pointer_1, int *pointer_2)
{
int *temp;
*temp = *pointer_1; //此语句有问题
*pointer_1 = *pointer_2;
*pointer_2 = temp; //形参指针变量pointer_1\pointer_2的值(即地址)没有发生改变,但是他们指向地址中内容发生了
//改变(实参指针变量也指向这些地址)
}
//在上面这段代码中,*temp是指针变量temp所指向的变量,但是由于未给temp赋值,因此temp并没有确定的值(它的值是不可
//预见的),所以temp所指向的单元也是不可预见的。所以,对*temp赋值就是向一个未知的存储单元赋值,而一个未知的存储
//单元中可能存储着一个有用的数据,就有可能破坏系统的正常工作状况。
代码示例:
//输入三个整数,要求按由大到小的顺序将他们输出,用函数实现。
int main(void)
{
void exchange(int *pointer1, int *pointer2, int *pointer3);
int a, b, c, *pointer_1, *pointer_2, *pointer_3;
printf("please enter three numbers:\n");
scanf_s("%d,%d,%d",&a,&b,&c);
pointer_1 = &a;
pointer_2 = &b;
pointer_3 = &c;
exchange(pointer_1, pointer_2, pointer_3);
printf("the order is %d, %d, %d\n", a, b, c);
system("pause");
return 0;
}
void exchange(int *pointer1, int *pointer2, int *pointer3)
{
void swap(int *pt1,int *pt2);
if (*pointer1 < *pointer2)
swap(pointer1, pointer2);
if (*pointer1 < *pointer3)
swap(pointer1, pointer3);
if (*pointer2 < *pointer3)
swap(pointer2, pointer3);
}
void swap(int *pt1,int *pt2)
{
int temp;
temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;
}