一.一维数组
1.定义
- 定义
- float a[0];//数组大小为0没有意义,不能这样
- int k=3,a[k]; //不能用变量说明数组大小
2. 数组在内存中的存储
- 初始化
- int a[10]={0}; //后面全是0
- int a[10]={1,2,3}; //后面全0
- int a[]={1,2,3,4,5};//相当于a[5]
- 一维数组的存储及函数传递
- 数组值地址按从小到大
- 变量定义先放在高地址,然后才低地址
- 除了for循环,没有其他办法能将数组里的元素一次性全部打印出来
- 一维数组传给子函数时,子函数并不知道有多少元素
#include<stdio.h>
#include<stdlib.h>
#define N 10
void print(int a[],int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%3d",a[i]);
}
a[4]=20;
printf("\n");
}
int main()
{
int i=10;
int arr[N]={1,2,3,4,5};
print(arr,N);
printf("%d=arr[4]",arr[4]);
system("pause");
}
3.栈空间和数组
- windows操作系统中单个函数的栈空间大小是1MB,Linux是10MB
- 爆栈—数组过大 , 递归
- 工作时不建议用递归
二.二维数组
1.初始化
int a[][4]={1,3,5,7,8,11,13,15,17,19,21,23};
int a[3][4]={{1,3,5,7},{8,11,13,15},{17,19,21,23}};
int a[3][4]={{3},{5}};
2.二维数组的传递
#include<stdio.h>
#include<stdlib.h>
void print(int a[][4],int row)
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<sizeof(a[0])/sizeof(int);j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
a[2][3]=50;
}
int main()
{
int a[][4]={1,3,5,7,8,11,13,15,17,19,21,23};
print(a,3);
printf("a[2][3]=%d\n",a[2][3]);
system("pause");
}
- arr是指针,arr[0]是一维数组.arr[][3]中的3非常重要,3列,一定要写
- 传入的是4行
- 传入的是3行
- 一维数组数组名存到是整型指针,2维数组数组名存到是数组指针
三.字符数组
- while读取也可以,读一个打一个
- 不需要加flfush(stdin).输入和输出缓冲区,输了hellow,第一次读取h,并打印了,然后本该又到e了,但是这是缓冲区全部清除了,下面都没 了
1.初始化
- char c[10]={‘1’,‘2’,‘3’,‘4’,‘5’};//单引号是字符,后面默认跟一个结束符’\0’.不要用这种,太low了
- printf("%s\n",c);//c是字符数组数组名,也只能放字符数组数组名,遇到结束符就不打了
- 打印出烫烫烫烫,说明没控制好结束符
- char c[10]=“12345”
- c[i]!=0;或c[i]!=’\0’都可以
- 初始化字符数组时要赋初值0,不然打印都是烫烫烫…
- 遇到结束符会停止.
- scanf函数字在读取字符串时遇到空格就认为读取介结束
- 非要读多个字符串,%s会忽略空格
2.gets与puts
- NULL 就是0,防止编译警告
- gets()的返回值时读入的字符串
- gets()会读取空格,但遇到\n不会存储,而是把它翻译成’\0’,即结束
- puts(arr)=printf("%s\n",arr);
- puts默认加一个换行
3.接口
- str系列接口
- strn系列
- mem系列