C语言指针这一部分很长,也很繁琐,最重要的一点就是要明白指针是怎么用的,当然,如果能够知道其中的原理那就太棒了。
一、指针变量与普通变量
关于指针变量与普通变量,初学者只要知道以下的两点就可以了:
- 指针=&变量
- *指针=指针指定的变量的值
前者是将指针和某一变量相关联,当我们用指针与某一变量相关联好后,就可以用*指针来代表该指针所关联的变量的那个值。
举个例子:
int *p,a=5;
p=&a;
int *q,b=10;
q=&b;
int c,d;
c=*p+1;
d=*q+2;
以上代码块的意思:
p指向a这个变量,q指向b这个变量。指针已经指向某一个变量后,我们用*指针就能代表一个值了。比如上面的*p:就相当于p指向的变量a的值,也就是5。同理*q就是10。
c等于指针p指向的值加1,也就是6。d就等于q指向的值加2,也就是12。
同时,指针的指向也是可以改变的。比如,看如下代码:
int *p,a=5;
p=&a;
int *q,b=10;
q=&b;
int *r;
r=p;
p=q;
q=r;
我们定义了一个新的指针变量r,并且让r的指向等于p的指向,p原来的指向是a,所以r的指向也是a。同理,p的指向变成了b,q的指向变成了a。通过最后四行代码可以使它们的指向互换。
当然,上面所说的*p、*q除了能表示一个值以外,还能起到赋值的作用。比如(我们在以上代码的基础上加上后面两行):
int *p,a=5;
p=&a;
int *q,b=10;
q=&b;
int *r;
r=p;
p=q;
q=r;
*p=99;
*q=100;
因为*p指的是指针p所对应的变量的值,所以b的值就不是10了,而是99。同理,因为*q指的是q指向的那个变量a,所以a的值变成了100。
总结一下:
- 我们要使用指针之前,首先要给它定型;指针的类型取决于它关联的变量,如果它关联的变量是整数型,那这个指针就是整数型;如果它关联的变量是字符型,那指针就是字符型。
- 定义完一个指针后,一定要将指针与某一个变量相关联,关联的方法就是:指针=&变量(p=&a)。
- 然后,指针的指向是可以改变的。如果要让指针的指向互换,只需定义一个新的指针。然后执行上面代码块的倒数第三、四、五行代码(r=p;p=q;q=r)。
- 最后,在指针的前面加上一个*号,就代表指针所指向的那个变量的值。这个*号指针的值(如*p),可以当成某一个数参与某一个计算,也可以通过对它赋值的方式,影响它指向那个变量本身的值。
明白这些以后,我们尝试做一道题:
输入两个整数,按先大后小的顺序输出这两个数。请用指针来编程。
解法1:
#include<stdio.h>
int main()
{
int a,b,*p,*q,*r;
printf("请输入两个整数:\n");
scanf("%d,%d",&a,&b);
p=&a;
q=&b;
if(a<b)
{
r=p;
p=q;
q=r;
}
printf("较大数位%d,较小数位%d。\n",*p,*q);
return 0;
}
解法2:
#include<stdio.h>
int main()
{
int a,b,*p,*q,t;
printf("请输入两个整数:\n");
scanf("%d,%d",&a,&b);
p=&a;
q=&b;
if(a<b)
{
t=*p;
*p=*q;
*q=t;
}
printf("较大数位%d,较小数位%d。\n",a,b);
return 0;
}