指针Word格式.docx

上传人:b****5 文档编号:15874941 上传时间:2022-11-16 格式:DOCX 页数:21 大小:90.06KB
下载 相关 举报
指针Word格式.docx_第1页
第1页 / 共21页
指针Word格式.docx_第2页
第2页 / 共21页
指针Word格式.docx_第3页
第3页 / 共21页
指针Word格式.docx_第4页
第4页 / 共21页
指针Word格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

指针Word格式.docx

《指针Word格式.docx》由会员分享,可在线阅读,更多相关《指针Word格式.docx(21页珍藏版)》请在冰豆网上搜索。

指针Word格式.docx

“直接访问”方式。

2.就是把一个变量地址放在另一个变量中,通过先访问存放地址的这个变量,得到变量的地址,进而访问变量。

这种方式称为“间接访问”。

变量的指针和指向变量的指针变量

二、指针变量的定义

类型标识符*指针变量名;

例如:

int*p;

这是什么意思呢?

含义:

这表示定义了一个指针变量p,它指向一个整型变量

也就是说,p中可以存放一个整型变量的地址。

上面定义了一个指针变量p,它和一般变量的定义有什么不同?

这时p的值是怎样?

为什么?

要想使它指向一个变量应怎么做?

请看下例!

例:

int*p,i=3;

p=&

i;

说明:

1、标识符前面的“*”表示该变量为指针变量

2、一个指针变量只能指向同一个类型的变量

想一想,如有定义:

floatf=4.5;

能否这样做:

f;

三、指针变量的引用

在定义了一个指针变量之后可以对该变量进行各种操作。

给一个指针变量赋一个地址值,输出一个指针变量的值,访问指针变量所指向的变量等。

那么如何访问呢?

C语言中有两个有关的运算符:

1.&

取地址运算符

2.*指针运算符或指向运算符,也称间接运算符。

如:

则:

*p=5;

这时的*p与定义指针变量时用的*p含义不同,在定义时int*p中的*不是运算符,它只是表示其后面的变量是一个指针类型的变量,而在程序的执行语句中引用的*p,其中的*是一个指针运算符,*p表示“p指向的变量”。

请看下页几个使用指针变量的例子。

如有这样的语句:

printf(“%o”,p);

p=&

scanf(“%d”,p);

printf(“%d”,*p);

它们分别表示什么意思?

请思考一会儿,请同学回答!

弄清楚了吗?

如没问题,请看后面的说明!

说明

1.如果已执行了“p=&

a”,若有&

*p的含义是什么?

&

和*运算符的优先级别相同,结合方向:

自右而左。

先进行*p计算,就是变量a,再执行&

运算,与&

a相同。

2.*&

a的含意:

先进行&

a运算,得a的地址,再进行*运算,即&

a指向的变量。

*&

a与*p作用一样,等价于变量a。

3.(*p)++相当于a++

*p++先按p的原值进行*运算,得到a,再使p的值自增,这样p就不再指向a了。

main()

{int*p1,*p2,i1=10,i2=20,*p;

p1=&

i1;

p2=&

i2;

printf(“i1=%d,i2=%d\n”,*p1,*p2);

*p=*p1;

*p1=*p2;

*p2=*p;

}

小结:

作业:

指针

(2)

一、指针变量作函数的参数

指针变量作函数的参数是将变量的地址传到另一个函数中。

下面请看下例:

{voidsub();

intx,y;

sub(&

x,&

y);

printf(“%d,%d\n”,x,y);

}

voidsub(int*px,int*py)

{*px=10;

*py=20;

注:

1.以前讲过“函数参数的传递是单向的,调用一次函数可以得到一个返回值”那么这里是不是“双向”传递数据呢?

不是。

这里仍然是单向的“值传递”方式。

调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。

2.因此,用指针(地址)作函数参数,可以实现“通过被调用的函数改变主调函数中变量的值”的目的。

如果想通过函数调用得到n个要改变的值应怎么办呢?

如果想通过调用函数得到n个要改变的值可以:

1.在主调函数中设n个变量,用n个指针变量指向它们。

2.然后将指针变量作实参,将这n个变量的地址传给所调用函数的形参。

3.通过形参指针变量,改变该n个变量的值。

4.主调函数中就可以使用这些改变了值的变量。

二、数组的指针和指向数组的指针变量

指向数组元素的指针变量的定义和赋值

inta[10],*p;

如何将指针变量p指向数组a呢?

对,可以这样做:

a[0];

还可以怎样做呢?

p=a;

int*p,a[10];

表示:

对p当前所指向的数组元素赋一个值

C规定p+1指向数组的下一个元素。

数组元素是实型,每个元素占4个字节,则p+1意味着使p的原值加4个字节,以使它指向下一个元素。

p+1所代表的地址实际上是p+1*d,d是一个数组元素所占的字节数。

(1)p+i和a+i表示:

是a[i]的地址

(2)*(p+i)或*(a+i)表示:

p+i或a+i所指向的数组元素。

即a[i]

(3)指向数组的指针变量也可以用下标表示因为*(a+i)表示a[i],而*(p+i)也表示a[i],因此我们也可以用p[i]来表示。

总结一下引用数组元素有几种方式:

用三种方法:

(1)下标法

(2)地址法

(3)指针法

请看下例:

[例]分别用下标法、地址法、指针法访问数组元素

{inta[5]={1,3,5,7,9},i,*p;

for(i=0;

i<

5;

i++)

printf(“%d”,a[i]);

/*下标法*/

注意指针变量的运算:

假设有p=&

p指向下一元素,不能表示为a++

等价于*(p++),先取*p,再使p加1

*(++p)先使p加1,再取*p

表示p所指向的元素值加1

(1)p++

(2)*p++

(3)*(p++)与*(++p)

(4)(*p)++

知道它们的含义吗?

[例]输入若干天的温度,求平均温度。

用数组存放输入的若干个温度值,当输入完所需处理的温度后,输入“0”表示输入结束。

然后对已输入的温度求平均值。

(假设输入的温度只能为正值,用两种方法:

1、地址法2、指针法)

main()/*方法一*/

{floattemper[31],sum=0;

intnum,day=0;

do{printf(“Entertemperatureforday%d:

”,day);

temper+day

scanf(“%f”,_____________);

*(temper+day++)>

}while(_____________________);

num=day-1;

*(temper+day)

for(day=0;

day<

num;

day++)

sum+=________________;

printf(“Averageis%4.1f”,sum/num);

main()/*方法二:

指针法*/

p=temper

float*p;

_____________;

p

”,day++);

*(p++)>

scanf(“%f”,___________);

}while(__________________);

*(p++)

数组名作函数参数

[例]从10个数中找出其中最大值和最小值。

(本题不要求改变数组元素的值,只要求得到最大值和最小值,而函数只能得到一个返回值,想一想用什么办法?

方法一:

形参、实参用数组名

定义两个全局变量分别存放最大值max和最小值min。

先将数组中的第0个元素值赋给它们,然后再与其余的元素一一比较,如果max的当前值比参与比较的元素的值小,则将此时的元素值赋给max,同时,将min的当前值与该元素比较,如min比该元素值大,则将该元素的值作为新的min。

然后再与下一元素比较,以此类推。

从而找出一个数组中的最大和最小值。

intmax,min;

voidmax_min_value(intarray[],intn)

{int*p,*array_end;

array_end=array+n;

max=min=*array;

for(p=array+1;

p<

array_end;

p++)

if(*p>

max)max=*p;

elseif(*p<

min)min=*p;

return;

main中的调用语句为:

max_min_value(number,10);

方法二:

形参、实参用指针

voidmax_min_value(int*array,intn)

max_min_value(p,10);

归纳起来,如果有一个实参数组,想在函数中改变数组的元素的值,实参与形参的对应关系有以下4种情况:

(1)形参和实参都用数组名

(2)实参用数组名,形参用指针变量

(3)实参形参都用指针变量

(4)实参为指针变量,形参为数组名

指针(3)

了解多维数组指针的含义和作用

了解行控和列控的概念和含义

掌握多维数组指针变量的形参和实形的使用

多维数组地址的描述

多维数组指针的使用

指向多维数组的指针和指针变量

1.多维数组的地址

一个二维数组可以认为由若干个一维数组所组成,其中每一个一维数组包含若干个元素。

设有数组:

inta[2][3];

则在内存中是如何存放的呢?

请看下图:

再来看数组inta[2][3];

从上图可以看出:

a或a+0指向a[0];

a+1指向a[1];

也可以表示为:

a==&

a+1==&

a[1];

因此,有下表:

表示形式含义

二维数组名,数组首地址

第1行起始地址,&

a[1]

第i行起始地址,&

a[i]

a[0],第0行起始地址

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 司法考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1