指针1.docx
《指针1.docx》由会员分享,可在线阅读,更多相关《指针1.docx(7页珍藏版)》请在冰豆网上搜索。
![指针1.docx](https://file1.bdocx.com/fileroot1/2023-7/19/bc50d23c-13eb-4fa0-9232-0c3e2a665f3f/bc50d23c-13eb-4fa0-9232-0c3e2a665f3f1.gif)
指针1
一、指针、指针变量
二、指针与数组
1、指向数组元素的指针
inta[10];
int*p;
可以赋值为:
p=&a[0]
或者p=a
2、通过指针引用数组元素
如果p的初值为&a[0],则:
(1)p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素。
(2)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
(3)指向数组的指针变量也可以带下标,如p[i]与*(p+i)。
a.下标法。
如a[i]形式。
b.指针法。
如*(a+i)或者*(p+i)。
输出数组中的全部元素。
(1)下标法:
#include
voidmain()
{inta[10];
inti;
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
printf(“\n”);
for(i=0;i<10;i++)
printf(“%d”,a[i]);
printf(“\n”);
}
(2)通过数组名计算数组元素地址,找出元素的值。
#include
voidmain()
{inta[10];
inti;
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
printf(“\n”);
for(i=0;i<10;i++)
printf(“%d”,*(a+i));
printf(“\n”);
}
(3)用指针变量指向数组元素。
#include
voidmain()
{inta[10];
inti,*p;
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
printf(“\n”);
for(p=a;p<(a+10);p++)
printf(“%d”,*p);
printf(“\n”);
}
通过指针变量输出a数组的10个元素。
#include
voidmain()
{inta[10],i,*p;
p=a;
for(i=0;i<10;i++)
scanf(“%d”,p++);
printf(“\n”);
for(i=0;i<10;i++,p++)
printf(“%d”,*p);
printf(“\n”);
}
观察结果对否?
三、用数组名作函数参数
例:
将数组a中n个整数按相反顺序存放。
#include
voidmain()
{voidinv(intx[],intn)
inti,a[10]={3,7,9,11,0,6,7,5,4,2}
printf(“theoriginalarray:
\n”);
for(i=0;i<10;i++)
printf(“%d,”,a[i]);
printf(“\n”);
inv(a,10);
printf(“thearrayhasbeeninverted:
\n”);
for(i=0;i<10;i++)
printf(“%d,”,a[i]);
printf(“\n”);
}
voidinv(intx[],intn)
{inttemp,i,j,m=(n-1)/2;
for(i=0;i<=m;i++)
{j=n-1-i;
temp=x[i];x[i]=x[j];x[j]=temp;}
return;
}
或者:
voidinv(int*x,intn)
{int*p,temp,*i,*j,m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for(;i<=p;i++,j--)
{temp=*i;*i=*j;*j=temp;}
return;
}
在函数中调用数组中的元素的值,实参与形参的对应关系有4种:
(1)形参和实参都用数组名。
(2)实参用数组名,形参用指针变量。
(3)实参形参都用指针变量。
(4)实参为指针变量,形参为数组名。
四、指针与多维数组
定义:
inta[3][4];
可以把它看成3个元素(a[0],a[1],a[2])的一维数组,但每个元素又是一个含有4个元素的一维数组。
二维数组的数组名是二维数组的0行首地址;如a+1是跳过一行而不是一个元素。
行指针:
加1跳过一行的指针;指向一整行。
列指针:
加1跳一个元素的指针;指向一个元素,并且只有列指针才能指向元素。
二维数组数组名是一个行指针。
若a是一个二维数组,则有:
(1)a+i是行指针,指向行号为i的一整行,若对它加1则指到下一行;
(2)*(a+i)和a[i]相同,都是一个列指针即指向的是一个元素,若对它们加1则指到下一个元素。
即a[i][0]的地址。
(3)*(a+i)+j和a[i]+j相同,都是元素a[i][j]的地址,即与&a[i][j]等价。
(4)*(*(a+i)+j)、*(a[i]+j)、(*(a+i))[j]和a[i][j]相同,都表示元素a[i][j]本身。
例:
用指针变量输出二维数组元素的值:
inta[3][4];
int*p;
for(p=a[0];pprintf(”%d”,*p);
输出、排序
数组指针;课本249页例10.13、14题
字符串与指针:
课本252例10.17
指向函数的指针:
定义形式:
数据类型(*指针变量名)()
例如:
求a和b的大数。
返回指针的函数:
数据类型*函数名(参数表)
接上例。
程序填空:
函数longfun2(char*str)的功能是:
自左至右顺序取出非空字符串str中的数字字符,形成一个十进制(最多8位)。
函数为:
longfun2(char*str)
{
inti=0;
longk=0;
char*p=str;
while(*p!
=’\0’&&
(1))
{if(*p>=’0’&&*p<=’9’)
{k=
(2)+*p-’0’;
++i;
}
(3);
}
returnk;
}
2.本函数输入n(<1000)个整数到指定数组,求该数组中最大元素的值和此元素的下标,最大元素值以函数值返回,此元素的下标通过指针形参带回调用处。
#include
#defineMAXLINE1000
intmaxindex(inta[],int*index)
{inti,n;
do{
print(”pleaseinputn\n”);
scanf(”%d”,&a[i]);
}while();
for(i=0;iscanf(”%d”,&a[i]);
*index=0;
for(i=1;iif()*index=i;
return;
}
3.写一个函数,求一个字符串的长度。
在main函数中输入字符串,并输出其长度。