指针Word格式.docx
《指针Word格式.docx》由会员分享,可在线阅读,更多相关《指针Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
“直接访问”方式。
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行起始地址