1、第九章 数组,常用于处理大批量数据 数据特点:存在内在联系 数组具有相同数据类型的变量集合 这些变量都有相同名字,但下标不同 称这些变量为数组元素 只有一个下标一维数组 有两个下标二维数组,本章将介绍的内容,91 一维数组的定义 92 一维数组与指针 9. 3 一维数组与函数 9. 4 一维应用 95 二维数组 96 二维数组与指针 9. 7 二维数组与函数实例的部分程序,91 一维数组,9.1.1 一维数组的定义和引用 9.1.2 一维数组的初始化 9.1.3 一维数组程序举例,9.1.1 一维数组的定义和引用,【例91】一维数组示例。 #define N 10 main( ) int i,
2、a3; float bN; a0=2; a1=4; a2=a0+a1; for ( i=0; iN; i+ ) scanf(“%f“, ,N为符号常量,给数组a的元素赋值,运行结果:,1 2 3 4 5 6 7 8 9 10,2 4 6,1 2 3 4 5 6 7 8 9 10,数组a的元素值,数组b的元素值,int a3; 表示: a为一维数组名 a的长度为3,即含3个元素 元素为a0、a1、a2 元素类型均为整型,说明:,每个元素都是变量,下标:02,float bN; 表示: 数组名为b b数组的长度为N 元素为b0、b1、b2、bN-1 各元素的类型为单精度型,不能含变量,数组元素代表
3、内存中的一个存储单元 数组元素像普通变量一样使用 数组元素用下标形式表示 常用循环对数组进行输入输出操作,为a数组分配3个连续的存储单元(2字节3=6个字节) 为b数组分配N个连续的存储单元(4字节N),用 #define N 10 定义符号常量N,方便修改程序例如,要将数组b的长度改为20,只需把命令行改为#define N 20其它部分无需改动,【例92】存放字符的数组示例。 #include main( ) int i; char ch4; ch0=G; ch1=o; ch2=o; ch3=d; for ( i=0; i4; i+ ) putchar(chi); ,运行结果: Good,
4、ch0,ch1,ch2,ch3,ch,ch数组的存储单元,一维数组的一般定义形式:类型名 数组名1 常量表达式1 ,数组名2 常量表达式2 , ; 例如,int a5, b6+3;,引用数组元素的形式:数组名 下标 例如,a2,bi,bi+1是合法引用 下标可以是常量、变量或表达式 其值必须确定、且是整型 系统不做下标越界检查,【例93】输入若干学生的成绩(用负数结束输入),计算其平均成绩,并统计不低于平均分的学生人数。,编程点拨:,为了统计不低于平均分的学生人数,先把学生成绩存起来,等到计算平均成绩后,再与平均分比较 如果使用普通变量,过程就会很繁琐 选用数组简化程序,#define N 4
5、0 main( ) int i, n=0, count=0;float score,total=0,aN,ave; printf(“data:n“); scanf(“%f“,学生人数不能多于40,a中存放成绩,ave=total/n; for ( i=0; i=ave ) count+; printf(“ave=%f,count=%d“,ave,count); ,运行结果: data: 55 66 77 88 99 100 1 ave=80.833336,count=3,计算平均成绩,统计不低于平均分人数,思考题,输入十个学生的成绩,统计低于平均分的人数。,for(i=0; i10; i+)
6、scanf(“%d”,for ( i=0; i=ave ) count+;,输入并计算平均分,统计低于平均分人数,printf(“%f,%d“,ave,count);,9.1.2 一维数组的初始化,【例94】一维数组的初始化示例。,int i; int a5=1,2,3,4,5; for( i=0; i5; i+ ) printf(“%5d“,ai);,等价于,5.1.2 一维数组的初始化,【例94】一维数组的初始化示例。,int i; int b5=2,3,4; for( i=0; i5; i+ ) printf(“%5d“,bi);,等价于,int b5=2,3,4,0,0;,5.1.2
7、一维数组的初始化,【例94】一维数组的初始化示例。,int i; int c =3,4,5,6,7; for( i=0; i5; i+ ) printf(“%5d“,ci);,等价于,int c5=3,4,5,6,7;,5.1.2 一维数组的初始化,【例94】一维数组的初始化示例。,int i; int d5=0; for( i=0; i5; i+ ) printf(“%5d“,di);,等价于,int d5=0,0,0,0,0;,5.1.2 一维数组的初始化,【例94】一维数组的初始化示例。,int i; int e5; for( i=0; i5; i+ ) printf(“%5d“,ei)
8、;,未初始化,不能写成 int e ;,输出不确定值,5.1.2 一维数组的初始化,【例94】一维数组的初始化示例。,int i; int f5=1,2,3,4,5,6,7,8;,提供数据过多,报错,定义数组的同时,给数组元素赋初值数组的初始化,【例95】存放字符的数组初始化示例。 #include main( ) int i; char a4=G,o,o,d; char b4=G; char c4= 0 ; for ( i=0; i4; i+ ) printf(“%c“,ai);printf(“n“);for ( i=0; i4; i+ ) printf(“%c“,bi);printf(“n
9、“);for ( i=0; i4; i+ ) printf(“%c“,ci); ,等价于,0,运行结果: Good G ,0在屏幕上无显示0的ASCII码值为0,【例96】定义含有10个元素的数组,并按顺序和逆序输出各元素的值。 #include main( ) int i,j,t;int a10=1,2,3,4,5,6,7,8,9,10; for( i=0; i=0; i- ) printf(“%4d“,ai); printf(“n“); ,运行结果:1 2 3 4 5 6 7 8 9 1010 9 8 7 6 5 4 3 2 1,【例97】定义含有10个元素的数组,并将数组中的元素按逆序重
10、新存放后输出。,a,a,值变化,逆序输出和逆序存放不同,a,b,按逆序将a数组的值赋给b数组,按顺序将b数组的值赋给a数组,a,方法1:开辟另一个数组,for( i=0; i10; i+) bi=a10-i-1;,for( i=0; i10; i+) ai=bi;,#include main( ) int i,a10=1,2,3,4,5,6,7,8,9,10,b10; for( i=0; i10; i+ ) printf(“%4d“,ai); printf(“n“);for( i=0; i10; i+ ) bi=a10-i-1;for( i=0; i10; i+ ) ai=bi; for( i
11、=0; i10; i+ ) printf(“%4d“,ai); printf(“n“); ,运行结果:1 2 3 4 5 6 7 8 9 1010 9 8 7 6 5 4 3 2 1,方法2:只开辟一个存储单元t,1 2 3 4 5 6 7 8 9 10,a,通过,交换,通过,交换,t,通过,交换,通过,交换,通过,交换,#include main( ) int i,t,a10=1,2,3,4,5,6,7,8,9,10; for( i=0; i10; i+ ) printf(“%4d“,ai); printf(“n“);for(i=0; i10/2; i+ ) t=ai; ai=a10-i-1
12、; a10-i-1=t; for( i=0; i10; i+ ) printf(“%4d“,ai); printf(“n“); ,能改成i10?,9.1.3 一维数组程序举例,【例98】观察运行情况,int i,t,a10=1,2,3,4,5,6,7,8,9,10;,t=a0;,for ( i=0; i9; i+ ) ai=ai+1;,a9=t;,for ( i=0;i10;i+) printf(“%4d“,ai);,1,2,3,4,5,6,7,8,9,10,1,向左移动,9.1.3 一维数组程序举例,【例98】观察运行情况,int i,t, b10=1,2,3,4,5,6,7,8,9,10;
13、,t=b9;,for ( i=9; i0; i- ) bi=bi-1;,b0=t;,for ( i=0;i10;i+) printf(“%4d“, bi);,10,2,3,4,5,6,7,8,9,10,1,向右移动,【例99】数组中已存互不相同的10个整数,从键盘输入一个整数,输出与该值相同的数组元素下标。,编程点拨:,使用循环将输入的数和数组元素逐个进行比较 如果找到相等的元素,用k记住该元素下标值 输出k的值,if( k!=-1 ) printf(“下标值=%dn“,k);,#include main( ) int i, x, , a10=1,2,3,4,5,6,7,8,9,10;for
14、( i=0; i10; i+ ) printf(“%4d“,ai);printf(“n“);,printf(“Input x:“); scanf(“%d“,for( i=0; i10; i+ ),if ( x=ai ) k=i;,输入需查找的数,若找到,用k记下标值,k=-1,else printf(“没找到 %dn“,x);,程序编写过程:,不能赋09之间的值,运行过程:,第一次运行: Input x:61 2 3 4 5 6 7 8 9 10 下标值=5 第二次运行: Input x:121 2 3 4 5 6 7 8 9 10没找到 12,优化程序:,main( ) int i, x,
15、k=-1 , a10=1,2,3,4,5,6,7,8,9,10;printf(“Input x:“); scanf(“%d“, ,break;,i10,i,【例910】输入十个互不相同的整数并存在数组中,找出最大元素,并删除。,编程点拨:,第一步:求最大值所在元素下标不必用max记住最大值,只要用k记住最大值所在的元素下标 第二步:删除最大值从最大值开始将其后面元素依次前移一个位置,#include main( ) int i,k,a10;printf(“Input data:“);for ( i=0; i10; i+) scanf(“%d“,a,k,k=0;,if ( aka1 ),k=1;
16、,真,执行,0,1,2,3,4,5,6,7,8,9,if ( aka2 ),k=2;,假,不执行,if ( aka3 ),k=3;,真,执行,下标=,k=0; for ( i=1; i10; i+ )if ( akai ) k=i;,a,for ( i=0; i9; i+)printf(“%4d“,ai);printf(“n“); ,最先,a 3 =a 3 +1;,最后,a8=a8+1;,k8,for ( i=k; i9; i+ ) ai=ai+1;,a,k,k,【例911】在数组中找出最小元素,并与第一个元素对调,第一步:求最小值所在元素下标,k=0; for ( j=1; jaj ) k=
17、j;,编程点拨:,第二步:最小元素与第一个元素对调 temp=a0; a0=ak; ak=temp;,#include main( ) int j,k,temp,a10;for ( j=0; j10; j+ ) scanf(“%d“,k=0; for( j= 0 +1; jaj ) k=j;,8,1,temp=a0; a0=ak; ak=temp;,5,for ( j=0; j10; j+ ) printf(“%4d“,aj); ,a,新的问题:,在后9个元素中,最小值与第二个元素对调,a,k= 1 ; for( j= 1+1 ; jaj ) k=j;,9,2,temp=a1; a1=ak;
18、ak=temp;,3,a,k= 1 ; for( j= 1 +1 ; jaj ) k=j;,10,3,temp=a2; a2=ak; ak=temp;,7,2,2,a,for( ; i= ; i+) ,k= 3 ; for( j= 3 +1 ; jaj ) k=j;,temp=a 3 ; a 3 =ak; ak=temp;,i,i,或k+1,i=0 8,由小到大的顺序排序,a,i,i,8,9,4,【例9.12】将10个数由小到大的顺序排序 方法1:用选择法排序 前面介绍的算法就是选择法排序的过程。,main( ) int i,j,k,temp,a10=10,9,8,2,5,1,7,3,4,6;
19、for ( i=0; iaj ) k=j;temp=ai; ai=ak; ak=temp;for ( i=0; i10; i+ ) printf(“%4d“,ai); ,方法2:用冒泡法排序参见教材中的方法2 方法3:参见教材【例5.13】,【例914】将键盘输入的一个数,插入到已按降序排列的数组中,要求按原来的排序规律插入。编程点拨: 定义数组时多开辟一个存储单元 找合适的插入位置 向右移动插入点后的元素 插入,#include main( ) int i,j=0,k,a11=20,18,16,14,12,10,8,6,4,2;for ( i=0; i10; i+ ) printf(“%4d
20、“,ai);printf(“n“);printf(“Input k:“); scanf(“%d“, ,15,k,15,j=0 aj k?,j=1 aj k? 即18 15 ? 是 j+,j=2 aj k? 即16 15 ? 是 j+,j=3 aj k? 即14 15 ?,while( aj=k ,找不到比k小的元素时也要退出循环,不是,结束循环,j=3,3,找合适的插入位置,即20 15 ? 是 j+,k,15,while( aj=k ,向右移动插入点后的元素,2,4,6,8,10,12,14,a10=a9;,a 4 =a 3 ;,10j+1,aj=k;,for ( i=10; i=j+1;
21、i- ),ai=ai-1;,插入k的值,j+1,j,while( aj=k ,【例5.15】掷100次骰子,统计各点数出现的次数 编程点拨: 用for循环 i:1100 每次点数为16间数,用random(6)+1表示random(k):随机产生0,k-1内整数 定义数组a7,用ai统计出现点数为i的次数例如,若产生3,则执行a3=a3+1;,#include #include ,main( ) int i, n, a7=0;,for ( i=1; i=100; i+ ), n=random(6)+1; an=an+1; ,for ( i=1; i=6; i+ ) printf(“%8d“,a
22、i); ,randomize( );,不用a0,随机产生0至5,缺点:每次运行时产生与上次相同数,解决方法,要加,93 指针和一维数组,931 使指针变量指向一维数组 932 对指针的算术运算,一维数组占连续的存储单元 称第一个元素的地址为数组的地址 用数组名表示首地址,9.3.1 使指针变量指向一维数组,【例916】使指针变量指向一维数组或数组元素的示例,a,p,b,q,0 1 2 3 4,p=,或p=a;,q=,或q=b+2;,for ( i=0; i5; i+ ),ai=i;,或*(p+i)=i;,printf(“%4d“, ai);,或*(a+i),输出 0 1 2 3 4,a,p,b
23、,q,0 1 2 3 4,7.0 6.0 5.0,p=a;,或p=,q=,或q=b+2;,for ( i=0; i5; i+ ),*(p+i)=i;,或ai=i;,printf(“%4d“,*(a+i);,或ai,输出 0 1 2 3 4,printf(“n“);,*q = 5; *(q-1) = 6; *(q-2) = 7;,printf(“%4.1f%4.1f%4.1fn“,b0, b1, b2);,输出 7.0 6.0 5.0,a,p,0 1 2 3 4,请思考:,若a0的地址为1000, 则a1、a2、a3、a4的地址?,1002、1004、1006、1008,a,p,0 1 2 3
24、4,请思考:,当p指向a 时, a1、a2、a3 、 a4的地址如何表示?,元素 a1、a2、a3 、 a4如何表示?,a+1 、 a+2 、 a+3 、 a+4,p+1 、 p+2 、 p+3 、 p+4,其它?,*( ),*( ),*( ),*( ),*( ),*( ),*( ),*( ),pi可取代*(p+i),p与a的变化规律相同,a,0 1 2 3 4,请思考:,当p指向a4 时, a0 、 a1、a2、a3 的地址如何表示?,元素 a0 、 a1、a2、a3 如何表示?,a 、 a +1 、 a+2 、 a+3,p-4 、 p-3 、 p-2 、 p-1,*( ),*,*( ),*
25、( ),*( ),*( ),*( ),*( ),p与a的变化规律不同,说明: 指针指向连续存储单元时,能进行加或减一个整数的运算 保证运算后的地址值不超出原连续存储单元的地址范围,【例917】假设数组中存放互不相同的10个整数,要求输入一个整数,查找与该值相同的数组元素,如果存在,输出其下标值,否则,输出相应信息(参见例99)。,main( ) int k,*p,a10=1,2,3,4,5,6,7,8,9,10;printf(“Input k:“); scanf(“%d“,printf(“n“); for( p=a; p-a 10; p+ )if ( k = *p ) break;,*p,k
26、= *p,if( p-a 10 ) printf(“下标值=%dn“, p-a); else printf(“没找到 %dn“,k); ,p-a 10,正常退出,提前退出,9.3.1 数组元素作实参,【例9.18】调用函数输出数组元素的值,void myfun ( int x, int y, int z) ;main( ) int a3=1,2,3; myfun ( a0, a1, a2 ) ; void myfun ( int x, int y, int z ) printf (“%d,%d,%dn“, x, y, z ); ,元素多时不方便,9.3.2 一维数组名作实参,【例919】一维数
27、组名作实参的示例,void myout ( int *p , int n ) ;,void, int i ;,for ( i = 0; i n ; i+ ),printf (“ %3d “, *(p+i) ) ;,printf (“n“ );,myout ( b , 10 ) ;,myout ( a , 5 ) ;,myout,( int *p, int n ),5,1 2 3 4 5,void myout ( int *p , int n ) ;,void, int i ;,for ( i = 0; i n ; i+ ),printf (“ %3d “, *(p+i) ) ;,printf
28、(“n“ );,myout ( b , 10 ) ;,myout ( a , 5 ) ;,myout,( int *p, int n ),10,1 2 3 4 5,1 2 3 4 5 6 7 8 9 10,【例920】假设一维数组中存放互不相同的十个整数,要求输入一个下标值后,从数组中删除该下标对应的元素,main( ) int n, k,a10=1,2,3,4,5,6,7,8,9,10; scanf(“%d“, ,3,myout( a ,10 );,myout ( a , n) ;,void myout ( int *a , int n );,int mydel ( int *a , int
29、 n, int k );,n=mydel ( a , 10 , k) ;,删除ak后,返回元素个数,a,*a,n =,10,printf (“%4d “, *a ) ;,a+; n-;,1,a,*a,n =,10,printf (“%4d “, *a ) ;,a+; n-;,9,1,printf (“%4d “, *a ) ;,1 2,a+; n-;,a,*a,n =,9,printf (“%4d “, *a ) ;,a+; n-;,8,1 2,printf (“%4d “, *a ) ;,a+; n-;,1 2 3,while ( n0 ),1 2 3 4 5 6 7 8 9 10,prin
30、tf (“n“ );,for ( i=k; in-1; i+ ),n-;,return n;,ai=ai+1;,3,或*(a+i)=*(a+i+1);,【例921】用选择法将10个数按由小到大的顺序进行排列,void mysort ( int p10, int n ) int i, j, k, t ;for ( i=0; ipj ) k=j; t=pi; pi=pk; pk=t; ,等价于int *p,void myout ( int a , int n ) while ( n0 ) printf (“%4d “, *a ) ; a+; n-; printf (“n“ ); ,等价于int *
31、a,9.5 二维数组,有两个下标的数组,a00,a01,a10,a11,a20,a21,1,2,3,4,5,6,a,行下标,列下标,【例922】二维数组的示例。 #include main( ) ,初始化二维数组,给第一行输入数据,定义b为两行五列数组,1 2 3 4 5,for(j=0; j5; j+) scanf(“%d“,给第二行输入数据,6 7 8 9 0,for(j=0; j5; j+) scanf(“%d“,int a32=1,2,3,4,5,6;,int i,j,b25;,for(j=0; j5; j+) scanf(“%d“,for(j=0; j5; j+) scanf(“%d
32、“,【例922】二维数组的示例。 #include main( ) ,int a32=1,2,3,4,5,6;,int i,j,b25;,for(i=0; i2; i+) for(j=0; j5; j+) scanf(“%d“,【例922】二维数组的示例。 #include main( ) int a32=1,2,3,4,5,6; int i,j,b25;for(i=0; i2; i+) for(j=0; j5; j+) scanf(“%d“, ,外循环控制行,内循环控制列,给数组赋值,for(i=0; i3; i+) for(j=0; j2; j+) printf(“%5d“,aij);pr
33、intf(“n“); printf(“Array b:n“);for(i=0; i2; i+) for(j=0; j5; j+) printf(“%5d“,bij);printf(“n“); ,按矩阵形式输出时需加此行,运行结果: 1 2 3 4 5 6 7 8 9 0 Array a: 1 2 3 4 5 6 Array b: 1 2 3 4 5 6 7 8 9 0,int a32 =1,2,3,4,5,6; 表示a为二维数组名,a含6个元素 各元素均为整型 常用双层for处理二维数组在内存中为a分配6个连续的存储单元(按行),说明:,1 2 3 4 5 6,a00,a01,a10,a11,
34、a20,a21,a,【例923】打印如下杨辉三角形。11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1,编程点拨: 杨辉三角形有如下特点: 只有下半三角形有确定的值 第一列和对角线上的元素值都是1,其它元素值均是前一行同一列元素与前一行前一列元素之和,#define N 6 main( ) int aNN,i,j;for(i=0; iN; i+)for(i=2; iN; i+)for(j=1; ji; j+) for(i=0; iN; i+) for(j=0; j=i; j+) printf(“%5d“,aij); printf(“n“); ,给第一列、对角线赋1,给
35、其它元素赋值,ai0=aii=1;,aij=ai-1j-1+ai-1j;,【例924】定义46的实型数组,并将各行前五列元素的平均值分别放在同一行的第六列上。,float a46;,定义46的实型数组,计算第一行平均值,sum=0; for(j=0; j5; j+)sum=sum+a 0 j ; a 0 5 =sum/5;,二,1,1,三,2,2,四,3,3,for(i=0; i4; i+) ,【例924】定义46的实型数组,并将各行前五列元素的平均值分别放在同一行的第六列上。,计算第一行平均值,sum=0; for(j=0; j5; j+)sum=sum+a 0 j ; a 0 5 =sum
36、/5;,四,3,3,各,i,i,main( ) float a46,sum; int i,j;for(i=0; i4; i+)for( j=0; j5; j+ ) aij=i*j+1; for(i=0; i4; i+) sum=0;for(j=0; j5; j+) sum=sum+aij;ai5=sum/5;for(i=0; i4; i+) for(j=0; j6; j+) printf(“%5.1f“,aij);printf(“n“); ,运行结果:1.0 1.0 1.0 1.0 1.0 1.01.0 2.0 3.0 4.0 5.0 3.01.0 3.0 5.0 7.0 9.0 5.01.0
37、 4.0 7.0 10.0 13.0 7.0,【例925】定义35的二维数组,并将最大的元素值和左上角的元素值对调。,分两步: 找最大值所在位置 对调,找最大值所在位置:,for(i=0; i3; i+) for( j=0; j5; j+ )if( akpaij ) k=i; p=j; ,对调:,i=akp; akp=a00; a00=i;,main( ) int i,j,k=0,p=0,a35= 3,1,10,4,7 ,22,32,5,15,6 , 11,21,8,9,16 ;printf(“Before:n“);for(i=0; i3; i+) for(j=0; j5; j+) print
38、f(“%5d“,aij);printf(“n“);,for(i=0; i3; i+) for( j=0; j5; j+ )if( akpaij ) k=i; p=j; i=akp; akp=a00; a00=i; printf(“After:n“);for(i=0; i3; i+) for(j=0; j5; j+) printf(“%5d“,aij);printf(“n“); ,运行结果: Before:3 1 10 4 722 32 5 15 611 21 8 9 16 After:32 1 10 4 722 3 5 15 611 21 8 9 16,9.6 二维数组和指针,9.6.1 二维
39、数组和数组元素的地址 9.6.2 用地址引用二维数组元素 9.6.3 指针数组 9.6.4 用行指针引用二维数组元素,9.6.1二维数组和数组元素的地址,1. 二维数组可看成是由一维数组组成的一维数组若:int *p,a34;则:p=*(a+i)或p=ai 表示指针p指向数组a的第i行,2. 二维数组名也是一个地址常量数组名表示数组的首地址,只是a0的基类型是整型,而a的基类型是整型一维数组。下面语句:int *p,a34;p=a; 错误 3. 二维数组元素的地址表示,9.6.2 用地址引用二维数组元素,aij *(ai+j) *(*(a+i)+j) (*(a+i)j *(&a00+4*i+j
40、),9.6.3 指针数组,int *p3,a34; for(i=0;i3;i+)pi=ai; 用指针引用二维数组元素 pij *(pi+j) *(*(p+i)+j) (*(p+i)j *(&p00+4*i+j),9.6.4 用行指针引用二维数组元素,int (*p)4,a34; p=a;,9.4.5 二维数组名作实参,【例9.27】调用函数,输出二维数组元素的值,#define M 3 #define N 4 void myout ( int p MN ) int i , j ;for(i=0; iM; i+) for(j=0; jN; j+) printf(“%5d“,pij);printf
41、(“n“); main( ) int aMN=1,2,3,4,5,6,7,8,9,10,11,12;myout ( a ) ; ,行指针,【例9.28】编写函数,计算二维数组中除周边元素之外的其它元素之和,1 2 3 45 6 7 89 10 11 1213 14 15 16,#define N 4 void myout ( int aNN ) ; int myfun ( int aNN ) ; main( ) int sum, aNN=1,2,3,15,16; myout ( a ); sum=myfun ( a ); printf(“ sum=%dn“,sum);,void myout ( int aNN ) int i , j ;for(i=0; iN; i+) for(j=0; jN; j+) printf(“%5d“,a i j );printf(“n“);,int myfun ( int aNN) int i, j, sum = 0;for ( i =1; i N-1; i+ ) for ( j =1; j N-1; j+ )sum = sum + a i j ;return sum;,指针数组作实参,Main() int *p3,a34;for(i=0;i3;i+) pi=ai;myfun(p); Myfun(int ),