您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页超经典的C语言指针讲解!

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

来源:意榕旅游网


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(\"a=%d,b=%d\

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(\"a=%d,b=%d\

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(\"please enter ten number:\");

for(p_a =a;p_a <(a+10);p_a++) //细看for圆括号中的语句

{

scanf(\"%d\

}

p_a =&a[0];

for(p_a =a;p_a <(a+10);p_a++) //细看for圆括号中的语句

{

printf(\"%d \

}

return 0;

}

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

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

int main (void)

{

int a[10];

int i;

printf(\"please enter ten number:\");

for(i =0;i <10;i++)

{

scanf(\"%d\

}

for(i =0;i <10;i++)

{

printf(\"%d \

}

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后再打印出来。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务