C语言一维数组声明、引用和调用(C89)
基础知识
1.数组声明:储存类型 类型说明符 数组名[整型常量表达式];声明时必须指定数组大小,其占用的空间是确定的。
2.数组名代表连续储存区域的起始地址,是个地址常量。因此数组名不能作为左值使用,只能逐个引用数组元素。
3.一维数组的初始化有四种形式,初值不能含有变量或函数调用形式。动态局部数组全部元素初值不确定,不应直接使用。
int a[5]={1,2,3,4,5}; //初始化所有元素 int b[5]={1,2}; //其余元素为0 int c[5]={0}; //全部元素为0 int d[]={1,2,3,4,5}; //大小由初值个数决定
4.引用一维数组:“ 数组名[下标] ”与“ *(数组名+下标) ”含义相同,下表是浮点数则简单地把小数部分去掉。
5.使用指针间接引用一维数组
- 以下三种写法等价。
int a[10]; int *p=&a[0];
int a[10]; int *p=a;
int a[10]; { int *p; p=&a[0]; }
- p+k和a+k都指第k号元素的地址;
- *(p+k)=*(a+k)=a[k],指第k号元素;
- 地址变量p可以进行++和--运算;数组名a是地址常量,不能进行++或--运算;
- 指针变量做减法运算获取两个数组元素之间的元素个数;
- *p++指先取*p的值,再将p指向下一个元素;
6.一维数组作函数参数
- 函数定义中以下写法完全等价;
void f(int a[10],int n); void f(int a[],int n); void f(int *a,int n);
- 指定数组大小是无效的,函数仅接收数组的起始地址,分配一个地址量长度的储存空间;
- 需要另设一个形参指出处理数组的大小;
//将数组a中的n个整数按相反顺序存放 void invert(int x[],int n) { int t,i=0,j=n-1; while(i<=j){ t=x[i]; x[i]=x[j]; x[j]=t; i++; j--; } }
一维数组应用
1.埃拉托色尼筛法:①挖去1;②用下一个未挖去的数除后面的数,把该数的倍数挖去;③检查是否小于sqrt(n),若否,结束;④剩下的数是素数。
#include<stdio.h> #include<math.h> int main() { int a[50]={0},n,k,p=2; scanf("%d",&n); for(k=2;k<=n;k++) a[k]=k; for(p=2;p<=(int)sqrt(n);p++) if(a[p]!=0) for(k=p+1;k<=n;k++) if(a[k]&&k%p==0) a[k]=0; for(k=2;k<=n;k++) if(a[k]) printf("%d",a[k]); return 0; }
2.有12个人围成一圈;按1~3报数,报到3的人离开;直到圈中只剩一人。
- 用数组元素a[1]~a[12]表示十二个位置,初值非0;
- 使用内循环,当该位置元素非0时增1,直到3将该元素归0;
- 对赋值0的元素计数,当计数11时,非0值得位置即所求。
#include<stdio.h> int main() { int a[13]={0},i,m,count; for(i=1;i<13;i++) a[i]=1; for(i=0,count=1;count<12;count++){ for(m=0;m<3;){ i=i%12+1; if(a[i]!=0) m++; } a[i]=0; } for(i=1;i<13;i++) if(a[i]) printf("%d",i); return 0; }
葡萄美酒夜光杯,欲饮琵琶马上催。