C语言编程入门——指针(上)

来源:互联网 发布:经济学最优化 编辑:程序博客网 时间:2024/06/03 06:59

    指针,是C语言的灵魂,也是C语言与其他高级编程语言不同的地方,它可以灵活的操作内存,同样,也会带来很多问题,需要安全的使用指针。

    指针变量是指存放变量地址的变量,刚开始学可能会有点困难,需要多多理解。


指针常见错误1:

# include <stdio.h>int main(void){int * p;  //定义int类型变量指针pint i = 3;*p = i; //此语句错误,*p未初始化,p存放了未知的地址,指向了未知的变量,如果被i修改,则会导致错误。printf("%d\n", *p);return 0;}


指针常见错误2:

# include <stdio.h>int main(void){long * p;double * q;int i = 3;double j = 5.5;long m = 5.5;//p = &j;//错误。//p = &m;//错误。//q = &i;//错误。//p = &i;//错误。 //注意:指针变量中,不同类型之间即使不会丢失精度,也不能够相互赋值。printf("%d\n", *p);printf("%lf\n", *q);return 0;}

经典指针程序——互换两个数:

/*2013年1月22日17:31:51本程序可说明指针使函数返回多个值此处涉及到值传递、指针传递和引用传递的区别:值传递是将i、j的值复制给swap函数;指针传递是swap函数中的a,b指向主函数的i,j。引用传递是swap函数中的a,b与主函数的i,j是同一个数,可认为a,b是i,j的别名。具体此处不再赘述,在以后的学习中将会理解。虽然指针传递与引用传递类似,但不可将指针与引用混为一谈,即不可认为指针就是引用,引用就是指针。若不使用指针,则输出结果为:a = 5, b = 3  //即说明在函数内部数值已交换。i = 3, j = 5  //而在主函数内部数值未交换。*/# include <stdio.h>//本函数为值传递,无法完成互换的要求。void swap_1(int a, int b){int t;t = a;a = b;b = t;printf("a = %d, b = %d\n", a, b);return;}//本函数为指针传递,但内部书写错误,将指针变量(地址)互换,指向互换,即原指针变量p指向a,q指向b,互换后,p指向b,q指向a。void swap_2(int * p, int * q){int * t; //同类型才可相互赋值,所以将变量t定义为 int * 类型。t = p;p = q;q = t;  //即p、q是指向i,j的指针变量,更改p、q的值不会改变i,j的值,p,q,i,j是四个不同的变量。return;}//本函数为指针传递,可以完成相互要求。void swap_3(int * p, int * q){int t;t = *p;*p = *q;*q = t;  //*p即为a,*q即为b,此处即为主函数中a,b互换。换言之:*p与a为同一变量,*q与b为同一变量。return;}int main(void){int i = 3;int j = 5;//swap_1(i, j);//swap_2(&i, &j);swap_3(&i, &j);  //指针传递,实参传递的应与形参类型一致,即传递地址,&i, &j。printf("i = %d, j = %d\n", i, j);return 0;}


指针热身程序:

# include <stdio.h>int main(void){int * p;  //定义整形指针变量,p是指针变量的名字,int * 表示p变量存放的是int类型变量的地址。     //p变量为int * 类型,即存放int变量地址的类型。int i = 3;p = &i;/*1. p保存了i的地址,因此p指向i,通过p可以找到i。2. p不是i,i也不是p,p与i是两个不同的变量。更准备地说:修改p的值不影响i的值,修改i的值不影响p的值。3. 如果一个指针变量指向了某个普通变量,则*指针变量  就完全等同于  普通变量例:如果p是个指针变量,并且p存放了普通变量i的地址则p指向普通变量i*p  就完全等同于 i, *p == i (*是取地址&的逆运算,可认为是取出指针所指向的普通变量。)或者说:在所有出现*p的地方都可以替换成i(除定义声明外)在所有出现i的地方都可以替换成*p*p 表示以p的内容为地址的变量所以,*p 就是 i,修改 *p 的值就是修改i的值。*/printf("i = %d\n", i);printf("i = %d\n", *p);*p = 99; //即修改了i的值。printf("i = %d\n", i);printf("i = %d\n", *p);return 0;}



1 0