若有:
int *p,s[10],i;
p=s;
则s[i]的地址可以表示为:
(1)&s[i]
(2)s+i
(3)p+i
数组元素s[i]的三种表达方式:
(1)*&s[i]
(2)*(s+i)
(3)*(p+i)
(4)p[i]
一、例题:
例9.1 定义一个含有30个元素的int类型数组,依次给数组元素赋奇数,然后按每行10个数顺序输出,再按每行10个数逆序输出。
/*例9.1*/
#include <stdio.h>
#define M 30
int main(void)
{
int i,j=1,a[M];
for(i=0;i<M;i++)
{
a[i]=j;
j+=2;
}
for(i=0;i<M;i++)
{
printf("%3d",a[i]);
if((i+1)%10==0)
printf("\n");
}
for(i=M-1;i>=0;i--)
printf("%3d%c",a[i],(i%10==0)?'\n':' ');//利用条件表达式决定输出换行符还是输出空格
}
例9.2 编写程序,通过一个函数给主函数中定义的数组输入若干大于或等于0的整数,用负数作为输入结束标志;调用另一个函数输出该数组中的数据。
#include <stdio.h>
#define M 100
void arrout ( int *, int ); int arrin ( int * );
main ( )
{ int s [M], k ;
k =arrin ( s ); arrout ( s , k );
}
int arrin (int *a )
{ int i=0 , x ; scanf ("% d", &x);
while ( x >=0 )
{ *( a+i ) = x; i++;
scanf ("% d", &x );
}
return i;
}
void arrout ( int *a, int n )//或者void arrout ( int a[], int n )
{ int i ;
for ( i =0; i <n ; i++)
printf ( (( i+1)%5==0) ? "%4 d\n": "%4d",*( a+i ) );//这里*(a+i)可以用a[i]代替
printf ("\n");
}
对于程序中的函数调用arrin (s);对应的函数首部可以写成以下三种形式:
1) arrin ( int *a )
2) arrin ( int a[ ] )
3) arrin ( int a[M] )
例9.3 编写函数,对具有10个元素的char类型数组,从下标为4的元素开始,全部设置星号“*”,保持前4个元素中的内容不变
#include <stdio.h>
#define M 10
#define B 4
void setstar ( char *, int );
void arrout ( char *, int );
main ( )
{char c[ M] ={ 'A','B','C','D','E','F','G','H','I','J' };
setstar ( &c[4], M-B );
arrout ( c, M );
}
void setstar ( char *a, int n )
{int i;
for ( i =0; i <n; i++) *( a+i ) ='*';
}
void arrout ( char *a, int n )
{int i;
for ( i =0; i <n; i++) printf ( "% c", a[ i] );
printf ("\n");
}
ABCD ******
setstar函数的首部还可写成以下形式:
setstar ( int a[ ], int n ) 或 setstar ( int a[ M-B], int n )
例9.4 编写程序,定义一个含有15个元素的数组,并编写函数分别完成以下操作:
(1)调用C库函数中的随机函数给所有元素赋以0 ~49的随机数;
(2)输出数组元素中的值;
(3)按顺序对每隔三个数求一个和数,并传回主函数;
(4)最后输出所有求出的和值。
#include <stdio.h>
#include "stdlib.h"
#define SIZE 15
#define N 3
void getrand ( int *, int );
void getave ( int *, int *, int );
void priarr ( int *, int);
main ( )
{ int x[ SIZE] , w[ SIZE/N] ={ 0 };
getrand ( x, SIZE);
printf ("Output %d random numbers:\n", SIZE);
priarr ( x, SIZE );
getave ( x, w, SIZE );
printf ("Output 5 sum numbers:\n");
priarr ( w, SIZE/N );
}
void getrand ( int *a, int n )
{ int i;
for ( i =0; i <n; i++) a[ i ] = rand( )%50;
}
void getave ( int *a, int *b, int n )
{ int i, j, sum;
for ( sum =0, i =0, j =0; i <=n; i ++)
{ sum+=a[ i];
if ( ( i+1) %3 ==0 )
{ b[ j] = sum;
sum =0;
j++;
}
}
}
void priarr ( int *a, int n )
{ int i;
for ( i =0; i <n; i++)
{ printf ("%5 d", a[ i] );
if ( ( i+1)%5 ==0 ) printf ("\n");
}
printf("\n");
}
结果:
Output 15 random numbers:
46 30 32 40 6
17 45 15 48 26
4 8 21 29 42
Output 5 sum numbers:
108 63 108 38 92
调用随机函数的方法如下(在程序开头应该包含头文件stdlib.h)
n=rand ()% x;
n将得到一个0到x -1的随机整数。因此,可用rand()% 50产生0 ~49的随机数。
例9.5 将数组中的数按颠倒的顺序重新存放。在操作时,只能借助一个临时存储单元而不得另外开辟数组。
#include <stdio.h>
#define NUM 8
void output(int *,int);
void daoxu(int *,int);
int main(void)
{
int a[NUM]={10,20,30,40,50,60,70,80};
printf("Output primary data : "); /*输出原始数据*/
output(a, NUM);
daoxu(a, NUM);
printf("Output the inverse data : "); /*输出颠倒后的数据*/
output(a, NUM);
}
void output(int s[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%4d",s[i]);
printf("\n");
}
void daoxu(int *a,int n)
{
int i, j, t;
i =0;j =n-1; /*i 是最前元素的下标,j是最后元素的下标*/
while(i <j) /*当i 大于或等于j 时,对调完成*/
{ t =a[i]; a[i] =a[j]; a[j] =t; /*下标为i 和j 的两个元素中的值对调*/
i++;j--; /*i 向后移一个位置,j向前移一个位置*/
}
}
例9.6 已知整型数组中的值在0至9的范围内,统计每个整数的个数。
#include <stdio.h>
#include <stdlib.h>
#define M 50
#define N 10
void getdata ( int *s)
{ int i;
for ( i =0; i <M; i++) s[ i] = rand()%10;
}
void stat ( int *a, int *c )
{ int i;
for ( i =0; i <N; i++) c[ i] =0;
for ( i =0; i <M; i++) c[ a[ i] ] ++;
}
void outdata ( int *c )
{ int i;
for ( i =0; i <N; i++) printf ("% d : %d\n", i, c[ i] );
}
main( )
{ int a[ M], c[ N];
getdata ( a );
stat ( a, c );
printf ("Output the result:\n");
outdata ( c );
}
例9.7 已知存放在a数组中的数不相重,在a数组中查找和x值相同的元素的位置。若找到,输出该值和该值在a数组中的位置;若没找到,输出相应的信息。
#include <stdio.h>
#define NUM 30
int arrin( int *a )
{ int i, n;
do
{ printf ("Enter number of elements,0 <=n <&d: ", NUM );
scanf ("% d", &n );
} while( ( n <1 ) ||( n >=NUM ) );
printf ("Enter %d integer numbers :\n", n );
for( i=0; i <n; i++) scanf ("% d", a+i );
return n;
}
int search ( int *a, int x, int n )
{int i, p;
i=0;
a[ n] =x;
while( x! =a[ i] ) i ++;
if ( i==n) p =-1;
else p =i;
return p;
}
main( )
{ int a[ NUM], x, n, p;
n =arrin ( a );
printf ("Enter the number to search: x =");
scanf ("% d", &x);
p =search ( a, x, n );
if ( p ! =-1 ) printf ("% d index is: %d\n", x, p);
else printf ("% d is not found ! \n", x);
}
例9.8 w数组中存放n个数据,编写函数删除下标为k的元素中的值。
#include <stdio.h>
#define NUM 10
int arrdel ( int *, int , int );
void arrout ( int *, int );
int getindex( int n );
main( )
{ int n, d,
int a[ NUM] ={21,22,23,24,25,26,27,28,29,30};
n =NUM;
printf ("Output primary data :\n");
arrout ( a, n );
d =getindex( n );
n =arrdel ( a, n, d );
printf ("Output the data :\n");
arrout( a, n );
}
void arrout ( int w[ ], int m )
{ int k;
for ( k =0; k <m; k++) printf ("% d ", w[ k]);
printf ("\n");
}
int arrdel ( int *w, int n, int k )
{ int i;
for ( i =k; i <n-1; i++) w[ i] = w[ i+1];
n--;
return n;
}
getindex( int n )
{ int i;
do
{ printf("\nEnter the index [ 0<= i<%d ]: ", n );
scanf ("% d", &i );
} while( i <0 ||i >n-1 );
return i;
}
例9.9 用选择法对数组中的数进行排序(按由小到大顺序)。
#include <stdio.h>
#define NUM 6
void arrsort( int [], int );
void arrout( int *, int );
main( )
{ int a[ NUM] ={5,7,4,2,8,6};
arrout ( a, NUM );
arrsort ( a, NUM );
arrout ( a, NUM );
}
void arrsort( int *a, int n )
{ int i, j, p, t;
for ( j =0; j <n-1; j ++)
{ p =j;
for ( i =j +1; i <n; i++)
if ( a[ p] > a[ i] ) p =i;
if ( p ! = j )
{ t =a[ j]; a[ j] = a[ p]; a[ p] = t;}
}
}
void arrout( int a[ ], int n )
{ int i;
for( i =0; i <n; i++) printf ("% d ", a[ i]);
putchar( \n );
}
二、习题: