一.一维数组
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系列