一、数组的基本知识
#include<stdio.h>
#include<stdlib.h> void main0(){
int a[]={,,,,};//数组在内存里是连续排列的
int i;//VS2012版本,变量的声明要放在最前面(所以建议大家使用VS2013及之后的版本)
printf("%d\n",sizeof(a));//求内存占多少
printf("%d\n",sizeof(a)/sizeof(int));//求数组有多少个元素
printf("%x\n",a); for (i = ; i < ; i++)//java语言中的a.length在这儿行不通,只能sizeof(a)/sizeof(int)
{
printf("a[%d]=%d &a[%d]=%x\n",i,a[i],i,&a[i]);
} system("pause");
} void main1(){
int i;
int a[];//数组越界不报错
//因为数组外部的内存空间,不确定是否有权限,
//如果越界访问,程序会崩溃
for (i = ; i < ; i++)
{
a[i]=i+;
}
getchar();
}
二、const和define的区别(const代码不可更改,可在内存里更改;define放在常量区,无论如何无法修改)
#include<stdio.h>
#include<stdlib.h>
#define N 20 void main(){
int a[N]; //只有define可以
//printf("%d", &N); 报错,编译器放在常量区,没有地址,无从修改 const int num = ; //可变的常量,可以强制去掉常量的属性
//num = 12; const限定代码不能修改,在内存有实体,是可以变的数
printf("%x", &num);
//int b[num];//这样不可以 system("pause");
}
三、数组初始化
#include<stdio.h>
#include<stdlib.h> void main(){
//int num[10]={1,2,3,4,5,6,7,8,9,10};
//int num[10]={1,2,3,4,5,6,7,8};//不足部分,填充为0
//double num[10]={1,2,3,4};
//数组元素大小已经确定,下标可以省略
//double num[] = { 1, 2 };
//double num[] = {};//无法指定数组的大小,无法分配内存
double num[] = { };
printf("%x",&num);
getchar();
}
四、数组操作说明
#include<stdio.h>
#include<stdlib.h> void main4(){
int a[]={,,};
int b[];
int i;
//b=a; 数组不能进行赋值,数组名是一个地址常量
printf("%x\n", a);
for (i = ; i < ; i++)
{
scanf("%d", &a[i]);
printf("%d\n", a[i]);
}
system("pause");
} void main5(){
char str[] = { '', 'a', '', 'm', '\0' };//以'\0' 结束才不会出现“烫烫”
//char strm[15] = { 'c', 'a', 'l', 'c' };
char strm[] = { 'c', 'a', 'l', 'c' ,'\0'};
char strn[] = "notepad";//双引号会自动加上/0
scanf("%s", strn); //只有字符串才能整体输入输出
printf("%s", str);
system(strm);
system(strn);
system("pause");
}
五、数组访问
#include<stdio.h>
#include<stdlib.h> void main(){
int num[] = { , , , , , , , , , };
int i;
for (i = ; i < ; i++)
{
printf("%d,%d,%x,%x\n", num[i],*(num+i),&num[i],num+i);
//num[i]与*(num+i)等价 &num[i],num+i等价
}
printf("\n逆序\n");
for (i = ; i >= ; i--)
{
printf("%d,%x\n", *(num + i), num + i);
} getchar();
}
六、斐波那契数列
#include<stdio.h>
#include<stdlib.h>
//F(n)=F(n-1)+F(n-2)
void main(){
//int a[50]; int最后会越界
double a[];
int i;
a[]=1.0;
a[]=1.0;
for (i = ; i < ; i++)
{
a[i]=a[i-]+a[i-];
printf("%f\n",a[i]);
}
getchar();
}
七、选择排序法
求最大值
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//时间随机数 void main(){
int num[];
time_t tms;//时间的数据类型
int i,X;
srand((unsigned int)time(&tms));//设置随机数种子
for (i = ; i < ; i++)
{
num[i]=+rand()%;
printf("%d\n",num[i]);
} X = ;//0是下标,我先假定0是最大的数
for (i = ; i < ; i++)
{
if (num[X] < num[i])
{
X = i;
}
}
printf("max=%d\n",num[X]);
getchar();
}
设置了随机数种子,每次的值都不一样
升序排列
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//时间随机数 void main(){
int num[];
time_t tms;//时间的数据类型
int i,j,tmp;
srand((unsigned int)time(&tms));//设置随机数种子
for (i = ; i < ; i++)
{
num[i]=+rand()%;
printf("%d\n",num[i]);
} for (i = ; i < -; i++)//注意是 i<数组.length-1
{
for (j = i+; j < ; j++)//注意是 j=i+1
{
if(num[i]>num[j]){//升序
tmp=num[i];
num[i]=num[j];
num[j]=tmp;
}
}
}
printf("\n排序以后\n");
for (i = ; i < ; i++)
{
printf("%d\n", num[i]);
}
getchar();
}
八、冒泡排序法(效率不如选择)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//时间随机数 void main(){
int num[];
time_t tms;//时间的数据类型
int i,j,tmp;
srand((unsigned int)time(&tms));//设置随机数种子
for (i = ; i < ; i++)
{
num[i]=rand()%;
printf("%d\t",num[i]);
}
//开始冒泡排序
for (i = ; i < -; i++)
{
for (j = ; j < --i; j++)
{
if(num[j]>num[j+]){
tmp=num[j];
num[j]=num[j+];
num[j+]=tmp;
}
}
}
printf("\n排序以后\n");
for (i = ; i < ; i++)
{
printf("%d\t", num[i]);
}
getchar();
}
九、数组与函数
#include<stdio.h>
#include<stdlib.h> void go(int a[]){//数组作为参数的时候,是传递地址
int b[];
printf("go=%d\n",sizeof(a));
printf("%d",sizeof(b));//这里的数组b非参数,即实际大小
} void main(){
int a[];
printf("%d\n",sizeof(a));
go(a);
getchar();
}