基礎知識
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; }
