去年学C语言课时,初步了解了指针的概念,能看懂一些简单的含有指针的程序,但事实上对于指针并没有真正的弄明白它的使用,这点我在半年后的数据结构课程上才深刻的体会到和别人的差距。更加可怕的是,对于当时所得的一知半解,现在已经忘的八九不离十了,所以决定进行C语言核心部分的重修,巩固自己的基础。
1.什么是指针?
定义一个变量,系统会为它分配内存单元,内存区的每一个字节有一个编号,即“地址”。
我们可以通过地址找到所需的变量单元,即:地址指向该变量单元。而这个地址便被形象化的称为“指针”。即:一个变量的地址称为该变量的指针。
2.什么是指针变量?
定义一个变量,专门用它来存放另一个变量的地址,这个变量被称为指针变量。指针变量的值是地址(指针)。
3.指针变量的定义。
int *p;//类型名 * 指针变量名;
***注意:指针变量p前面的*,指针运算符,表示的是“指向”,表示该变量的类型为指针型变量。在定义指针变量时必须指定基类型。
int a,b; int *p1,*p2;//定义两个指向int的指针变量p1,p2 p1=&a;//a的地址赋给指针变量p1 p2=&b;//b的地址赋给指针变量p2
***注意:&,取地址运算符,&a是变量a的地址。
4.指针变量的引用。
*p1=100;//将100赋给p指向的变量,即变量a=100 printf("%d",*p1);//输出a的值 printf("%o",p1);//输出a的地址
***注意:*p1指,指针变量p1指向的变量,即整型变量a。
5.指针的使用。
例1:输入a和b两个整数,按先后大小的顺序输出a和b的值。
1 #include <stdio.h> 2 int main() 3 { 4 int *p1,*p2,*p,a,b; 5 printf("请输入两个整数:"); 6 scanf("%d,%d",&a,&b);//输入数字时一定要使用英文状态下的逗号, 7 p1=&a; 8 p2=&b; 9 if(a<b) 10 { 11 p=p1; 12 p1=p2; 13 p2=p; 14 } 15 printf("a=%d,b=%d ",a,b); 16 printf("max=%d,min=%d ",*p1,*p2); 17 return 0; 18 }
例2:swap()函数实现交换两个变量的值。
1 int main() 2 { 3 void swap(int *p1,int *p2); 4 int a,b; 5 int *pointer_1,*pointer_2; 6 printf("please enter a and b:"); 7 scanf("%d,%d",&a,&b); 8 pointer_1=&a; 9 pointer_2=&b; 10 swap(pointer_1,pointer_2);//swap(a,b)是错误的 11 printf("a=%d,b=%d ",a,b); 12 return 0; 13 } 14 void swap(int *p1,int *p2) 15 { 16 int temp; 17 temp=*p1;//传a值 18 *p1=*p2;//传b值 19 *p2=temp; 20 }
swap函数的两个形参p1和p2是指针变量,实参pointer_1和pointer_2也是指针变量,调用函数时,进行的是“值传递”。这个时候p1和pointer_1都指向a,p2和pointer_2都指向b,swap函数中,*p1和*p2的值互换,也就使a和b的值互换了。
***注意:C语言中实参变量和形参变量之间的数据传递是单向的“值传递”的方式。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。
例3:输入3个整数a,b,c,要求按从大到小的顺序将它们输出,并用函数实现。
1 #include <stdio.h> 2 int main() 3 { 4 void exchange(int *q1,int *q2,int *q3); 5 int a,b,c,*p1,*p2,*p3; 6 printf("please enter three numbers:"); 7 scanf("%d,%d,%d",&a,&b,&c); 8 p1=&a; 9 p2=&b; 10 p3=&c; 11 exchange(p1,p2,p3); 12 printf("The order is:%d,%d,%d ",a,b,c); 13 return 0; 14 } 15 void exchange(int *q1,int *q2,int *q3) 16 { 17 void swap(int *pt1,int *pt2); 18 if(*q1<*q2) swap(q1,q2); 19 if(*q1<*q3) swap(q1,q3); 20 if(*q2<*q3) swap(q2,q3); 21 } 22 void swap(int *pt1,int *pt2) 23 { 24 int temp; 25 temp=*pt1; 26 *pt1=*pt2; 27 *pt2=temp; 28 }
函数的嵌套调用思维需要好好的积累和练习。
上述是指针的基本概念和简单应用,指针有很多灵活的使用,其中就包括指针和数组结合,指针和字符串结合的广泛使用。