指针,是C语言的灵魂,也是C语言与其他高级编程语言不同的地方,它可以灵活的操作内存,同样,也会带来很多问题,需要安全的使用指针。
指针变量是指存放变量地址的变量,刚开始学可能会有点困难,需要多多理解。
指针常见错误1:
# include <stdio.h> int main(void) { int * p; //定义int类型变量指针p int 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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/lfhappypain/article/details/47208461