超经典的C语言指针讲解!

2020-04-03 10:22

1

:C语言中实参变量和形参变量之间的数据传递是单向的直传递方式,形参的改变不能

使实参随之改变。看下面的程序: 题目:按先后顺序输出数值 错误程序:

/******************************************** #include Int mian () {

Void swap(int *p1,int *p2); Int a =3 ,b =9;

Int *pointer_1,*pointer_2;//定义两个变量分别指向变量a和b pointer_1 =&a; pointer_2 =&b; if(a

swap(pointer_1,pointer_2); }

printf(\return 0; }

void swap(int *p1,int *p2) {

int *p; p = p1; p1 =p2; p2 =p; }

主函数中调用了函数swap,将实参pointer_1和pointer_2的值传给形参p1和p2,即p1和p2也分别指向了变量a和b,在子函数中将p1与p2的值交换,即p1指向了b,p2指向了a,

但是实参pointer_1和pointer_2中的值没有随之改变,即pointer_1和pointer_2依旧分别指向a和b.随意打印出来的仍然是a=3,b=9.

***********************************************************/ 正确程序:

/******************************************** #include

Int mian () {

Void swap(int *p1,int *p2);

Int a =3 ,b =9;

Int *pointer_1,*pointer_2; pointer_1 =&a; pointer_2 =&b; if(a

swap(pointer_1,pointer_2); }

printf(\return 0; }

void swap(int *p1,int *p2) {

int temp; temp = *p1; *p1 =*p2; *p2 =temp; }

子涵数中将p1指向的变量(a)与p2指向的变量(b)互换,即将a和b的值互换,也就是a中放的是9,b中放的是3,而pointer_1和pointer_2分别指向a和b,所以打印出来发热结果是a=9,b=3.

总结:想通过调用函数来改变变量的值,应通过形参指针变量改变他们所指向的变量

***********************************************************/

2:

通过指针应用数组元素

2.1: 我们想调用数组中的元素时有两种方法,一种是下表法,如a[2];另一

种是指针法,如int *p=&a[0],p =a +2.两者都是调用a[2],但第二种方法要比第一种效率高。下面看两段程序:

/****************************************************** 文件名:指针——指向数组

功能: 用指针的方法向数组赋值,用指针的方法取数组中的值 说明:好好比较两段函数的不同

***********************************************************/

#include int main (void)

{ int a[10]; int *p_a;//定义一个指向数组的指针 p_a =&a[0]; printf(\ for(p_a =a;p_a <(a+10);p_a++) //细看for圆括号中的语句 { scanf(\ }

p_a =&a[0];

for(p_a =a;p_a <(a+10);p_a++) //细看for圆括号中的语句 { printf(\ } return 0; }

/****************************************************** 以上的程序还可以由下面的程序实现:

int main (void) { int a[10]; int i; printf(\ for(i =0;i <10;i++) { scanf(\ }

for(i =0;i <10;i++) { printf(\ } return 0; }

两段程序的功能是一样的,但第一段程序要快的多。C编译系统是将a[i]转换成*(a+i)来处理的,即用数组的首地址加上偏移地址

而用指针变量直接指向元素,不必每次都重新计算地址,P++这样的自加运算的速度是远快于a+i的。

***********************************************************/

2.2:程序的简写

一些牛B的程序员写程序时都是追求简洁明了的,所以对于初学者看他们的程序是很头疼的,下面看几段程序:

/********************* 程序1

Int a[3] ={1,5,9}; Int i=0 Int *p =a; For(;i<2;i++)

Printf(“%d”,*p++);

该段程序打印出来的是:1,5 *********************/ /********************* 程序2

Int a[3] ={1,5,9}; Int i=0 Int *p =a; For(;i<2;i++)

Printf(“%d”,*++p);

该段程序打印出来的是:5,9 *********************/ /********************* 程序3

Int a[3] ={1,5,9}; Int i=0 Int *p =a; For(;i<2;i++)

Printf(“%d”,(*p)++);

该段程序打印出来的是:1,2 *********************/ /********************* 程序4

Int a[3] ={1,5,9}; Int i=0 Int *p =a; For(;i<2;i++)

Printf(“%d”,++*p);

该段程序打印出来的是:2,3 *********************/

*p++相当于*(p++)即先打印出出p指向的单元的值后,再将p++ *++p相当于*(++p)即先将p++,再打印出P指向的单元的值 (*p)++,先打印出*p,再将p指向的单元的值加1,如p指向a[0]=1,则相当于先打印出a[0],再将a[0]+1

++*p相当于++(*p),将p指向的单元的值加1后再打印出来。


超经典的C语言指针讲解!.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:JAVA 编程作业--姓名

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: