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;
}

 

 
posted @ 2021-05-10 15:21  结城梨斗  阅读(1520)  评论(0编辑  收藏  举报