嵌入式开发第5天(数组)

来源:互联网 发布:python 写入文本文件 编辑:程序博客网 时间:2024/05/17 13:09

数组


一维数组

数组:由相同的类型组成,有固定个数,在内存中是连续的一片内存

类型  数组名【数组元素个数】={初值,初值....}   

初值的个数不能超出元素个数范围,可以小于

        类型:除了 bool 其余的类型都可以

int a[5] = {1,2,3,4,5};

int a[5];           //没有初始值,里面存放的是随机值。

int a[5] = {1,2};  --> int a[5]={1,2,0,0,0};//如果只有一个初值,系统会自动将后面的数据清零

   int  a[]= {1,2,3,4,5,6 };  --> int a[6]    //没有写元素个数,系统会自己计算。

int  a[]= {1,2,0,0,[89]=5,4};      //第89是5 ,90是4。2~88 系统默认为0;

int  a[]= {1,2,[89 ... 95]=5,9}    //第89~95 等于5 ,96等于9;    

使用:
下标[]:有效下标范围从0开始,有N个元素,有效下标为N-1
注意: 下标可以越界 ,但越界值非自己所定义的数组 
int a[5]={1}; printf("%d",a[5]) ;   //结果为越界值  

练习:修改数组的值int a={1,2,3,4,5,6,7,8,9,10}改为{11,12,13,14,15,16,17,18,19,20}




如何从键盘里面取值


int val;         scanf("%d",&val);


int a[10];       scanf("%d",&a[0]); 


注意:必记
int a[10];
通常:
a是数组名,是第一个元素的地址&a[0]
a ===========等价于===========&a[0];


1、&a表示指向整个数组的地址


int a[5]={1};


a addr    = 0xbfd7232c
a +1      = 0xbfd72330   4        a+1   ==== a+1*4     (4为数据类型大小)
&a[0]+1   = 0xbfd72330   4 &a[0]+1 ==== &a[0]+1*4 (4为数据类型大小)
&a      = 0xbfd7232c   0       &a = a = &a[0];值相等,但是是意义不同 
&a+1      = 0xbfd72340   20   &a+1  === a+4*5   (4代表数据类型大小,5代表元素个数)






char a[5]={1,3,6,9,10};


*(a+3) =   *(&a[0]+3)==a[3]
*a+3   =   a[0]+3



字符数组
char arr[6]="hello";{'h','e','l','l','o','\0'};


char arr[6]={'a','b','c','\0'};%s  %c


练习:
1、 在终端输入10值并存储到数据当中 
找到10个整形数的最大值和最小值,求这两个数之和
先设定一个参考的最大值max和一个参考的最小值min
然后逐个比较,如果有比max大或者比min小的,更改参考值。



2、读取输入,直到遇到字节#才结束,总字符不超过100个
   上报读取到的空格数目、换行符数目、其它字符的总数
   显示输入的整个字符数组


#include<stdio.h>
int main()
{
char c;
char buf[100];
int sum = 0,space=0,enter=0,other=0;
while(1)
{
if(sum < 100)
{
c = getchar();
if(c == '#')
{
break;
}
else
{
buf[sum] = c;
sum++;
}
if(c == ' ')
space++;
else if(c == '\n')
enter++;
else
other++;
}
else 
break;
}
printf("space =%d,enter=%d,other=%d",space,enter,other);
return 0;
}



3、冒泡排序法,将一组数组中的元素进行排序,排序从小到大;



int a[10];


a是数组名,是第一个元素的地址&a[0];
例如:sizeof(a) 整个数组的大小 


字符数组 ==== 字符串
int arr[50]="sdfea";
sizeof(arr);计算结果为整个数组的长度包括“\0”;


strlen(char *s);  //计算字符串长度,不包括'\0'




       #include <string.h>


       int strlen(const char *s);

返回值:字符串长度
const char *s:字符串的首地址;


练习:自己编写一个函数,函数实现strlen功能;




int my_strlen(const char *s)
{
int len = 0;
while(*s!='\0')
{
s++;
len++;
}


return len;
}


int main(void)
{
char a[100]="sdsadfsdfjfewsdf";
int main_len;



main_len = my_strlen(a);
printf("main_len = %d\n",main_len);


return 0;
}






函数:
模块化,黑盒子:不需要关心里面是怎么样实现,但是需要知道的输入及输出是什么


1、减少代码的重复编写,直接写一次,可以多次调用
2、函数功能可以写成一个模块,方便删除



函数定义
(函数存储类型)返回参数类型 函数名(参数) 
函数的存储类型: static 
返回参数类型  :char short int等基本数据类型,或者是地址。需要return;
如果不需要返回值,直接写成void,代码中不需要return;


函数名:
命名规则:下划线或者字母开头,由下划线、字母、数字


参数:可以是参数列表,如果不需要参数,传void
int i,int y


char short int等基本数据类型:


char fun(void)
{
char ch;
....
return ch;
}


地址:
int *fun(const char *s)
{
int *p;
.......
return p;
}


void Delay(int i,int j)
{
int x,y;
for(x=0;x<i;x++)
for(y=0;y<j;y++);
}




void fun(int a,int b)
{
....
....
....


}




int main(int argc,char **argv)


argc    : 参数个数
argv[n] : 参数内容地址


练习:在终输入时选择执行函数的功能,参数为a,计算两个数的和,参数为s,执行两个数相减,参数为f,对数组进行冒泡排序。
#include<stdio.h>
   
int main(int argc,char **argv)
{
int a,b,c,temp,mao[10];

  switch(*argv[1])
{

case 'a': goto add;
case 's': goto sub;
case 'f': goto maopao;

}


add: 
printf("please into two number\n");
scanf("%d %d",&a,&b);
printf("%d+%d=%d\n",a,b,a+b);

return 0;


sub:  
printf("please into two number\n");


scanf("%d %d",&a,&b);
printf("%d-%d=%d\n",a,b,a-b);


return 0;



maopao:


printf("please input ten number\n");


while(b<=9)
scanf("%d",&mao[b++]);


for(c=8;c>=0;c--)
{
for(b=0;b<=c;b++)
{


if(mao[b]<mao[b+1])
{


temp=mao[b];
mao[b]=mao[b+1];
mao[b+1]=temp;

}

}


}
b=10;
while(b>0)
printf("%d ",mao[--b]);

return 0;


}







练习:自己编写代码实现strcmp、strcat;


加强版练习:随机生成6位验证码:实现输入验证,如果三次输入错误,退出程序,正确输出:Helloworld







0 0
原创粉丝点击