在谭浩强老师编写的C程序设计(第二版)一书指针那一章节中,他明显的指出了每一个学习和使用C语言的人,都应该深入的学习和掌握指针。不掌握指针就没有掌握C语言的精华。因此指针的学习是非常重要的。在以下的几篇博客中,我将将自己在学习C语言中面临的一些困惑分享出来,希望对大家有所帮助。
1、在程序中每一个变量都是都有一个地址,一个变量的地址就称为该变量的指针。如果有一个变量专门用来存放另一个变量的地址,那么这个变量就称为指针变量。首先应该理解指针与指针变量两者的概念和区别。
下面举个例子来具体说明指针与指针变量:
int *p;
int i=3;
p=&i;
在此例中,p就是指针变量,i的地址可以用p来表示。*p=3,*p和i的作用相同。
2、定义指针变量
指针变量的定义格式为: 基类型 *指针变量名
指针变量名和定义一般变量一样,也可以为数组名。
关于为什么要定义基类型:因为不同的数据类型在内存中占据不同的字节,如整型占据两个字节,实型占据4个字节,字符型占据1个字节。指针在移动一个位置时,对应于整型变量移动2个字节,实型变量移动4个字节,而字符型变量移动1个字节。因此必须定义指针变量的类型即基类型。
3、关于指针变量运算符运算优先顺序的一些说明
*、&、++、--,他们的优先级别相同,运算顺序为从右至左。
4、交换指针变量的值和交换实参的值
main()
{
int *p1,*p2,*p,a,b;
a=3;b=4;
p1=&a;p2=&b;
if(a<b)
{
p=p1;p1=p2;p2=p;
}
printf("%d,%d",a,b);
printf("%d,%d",*p1,*p2);
}
输出结果为:3,4
4,3
下面这个程序结果则相反:
swap (int *p1,int *p2)
{int temp;
temp=*p1;p1=*p2;p2=temp;
}
main()
{
int a,b,*q1,*q2;
a=3;b=4;
if(a<b)swap(q1,q2);
printf("%d,%d",a,b);
}
输出结果为:4,3
最上面那个程序p1值由&a变成&b,p2值由&b变成&a,而下面那个程序则是在指针变量作为形参时,在函数执行过程中使指针变量所指向变量值发生变化时,函数调用结束后变化依然被保留下来。这样使用指针变量就解决了变量值“单向传递”的问题。