【嵌入式Linux C编程】2018.3.10 数组、函数

本文介绍了C语言中一维数组、二维数组及字符数组的定义、初始化与操作方法,包括数组的赋值、地址引用以及字符串的输入输出和常用处理函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组

一维数组

一维数组的定义格式为:

类型说明符  数组名[常量表达式]; 例如  int a10

它表示定义了一个整形数组,数组名为a,有10个元素。

在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。

常量表达式中可以包括常量和符号常量,但不能包含变量,即数组的大小不依赖于程序运行过程中变量的值。

a[0]存在低地址 ;a[9]存在高地址。每个数据元素占用的字节数,就是基类型的字节数。

在定义数组时可以对全部数组元素赋以初值,也可以只给一部分元素赋值,未赋值部分默认为‘0’。


数组的地址: 

printf("%p", a);//表示数组首元素的地址,步长为一个元素

printf("%p", &a);//表示数组的地址,步长为一个数组

二维数组

二维数组定义的一般形式为:

类型说明符  数组名[常量表达式][常量表达式]

例如:定义a3×4(34)的数组,b5×10(510)的数组。

float  a[3][4],b[5][10] ;

有4种方法可以给数组赋初值:

1 .分行给二维数组赋初值,例如:

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 

2.可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值例如:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

.可以对部分元素赋初值例如:

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

    也可以对各行中的某一元素赋初值,例如:

int a[3][4]={{1},{0,6}, {0, 0, 0, 11}}; 

.如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省例如:

int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

等价于

int a[ ][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
字符数组

字符数组的初始化与一维数组的初始化方法类似,但是字符元素要加上‘ ’,例如:

char c[10]={‘I’, ‘’,‘a’,‘m’,‘’,‘h’,‘a’,‘p’, ‘p’,‘y’} 

为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”——‘\0’,在内存中会自动添加一个‘\0’,输出字符不包括结束符0′,如果一个字符数组中包含一个以上0′,则遇第一个0′时输出就结束。

字符数组的输入输出有两种方法:

逐个字符输入输出。用格式符“%c”输入或输出一个字符;

将整个字符串一次输入或输出,用“%s”格式符输入输出一个字符串,输出时,printf函数中的输出项是字符数组名,而不是数组元素名;

 如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔。

例如

scanf(″%s%s%s″,str1,str2,str3);

处理字符串常用的函数有:

puts函数,一般形式为puts (字符数组);其作用是将一个字符串(0′结束的字符序列)输出到终端,字符串中可以包含转义字符;——类比printf()

gets函数,一般形式为:gets(字符数组);其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。——类比scanf()

strcat函数,一般形式为:strcat(字符数组1,字符数组2);其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1,函数调用后得到一个函数值——字符数组1的地址。

strcpy函数,一般形式为:strcpy(字符数组1,字符串2);是“字符串复制函数”,其作用是将字符串2复制到字符数组1中去。

使用该函数要注意的是:

1、字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度;

“字符数组1”必须写成数组名形式(str1)

“字符串2”可以是字符数组名,也可以是一个字符串常量。如:strcpy(str1″China″); 

2、“字符数组1”必须写成数组名形式(str1)“字符串2”可以是字符数组名,也可以是一个字符串常量。如:strcpy(str1″China″); 

3、复制时连同字符串后面的0′一起复制到字符数组1中;

4、可以用strncpy函数将字符串2中前面若干个字符复制到字符数组1中去;

例如:strncpy(str1str22);作用是将str2中前面2个字符复制到str1中去,然后再加一个‘\0’。;

5、不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如:

str1 = "china";//不合法
str2 = str2;//不合法
strcpy函数只能将一个字符串复制到另一个字符数组中去;
用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素

strcmp函数,其一般形式为:strcmp(字符串1,字符串2),作用是比较字符串1和字符串2;

比较的结果由函数值带回:

(1) 如果字符串1=字符串2,函数值为0;

(2) 如果字符串1>字符串2,函数值为一正整数;

(3) 如果字符串1<字符串2,函数值为一负整数。

比较的规范应该是:

if(str1>str2) 
	printf(″yes″);//不合法

if(strcmp(str1,str2)>0) 
	printf(″yes″);//正确合法

strlen函数,其一般形式为:  strlen (字符数组)。strlen是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括0′在内)例如:

char str[10]={″China″};
printf(″%d″,strlen(str));

函数

C程序中——只包含一个主函数main();或者包含一个主函数和若干个其它函数(库函数和自定义函数)。
格式如下:

函数类型     函数名(形式参数类型说明表)

{

  声明部分

  执行部分

}

函数调用的过程:

s1:根据函数名寻找函数入口地址;

s2:给形参分配空间;

s3:给形参赋值;

s4:执行函数体;

s5:返回返回值;

s6:释放为形参分配的空间;

函数调用的形式:

1)作为函数语句调用。函数一般无返回值。例:

printf(“Hello,World!\n”);

2)作为函数表达式调用。例:

m=max(a,b)*2;

3)作为函数参数调用。例:

printf(“%d”,max(a,b));
m=max(a,max(b,c));

参数又分为:形参实参

形式参数:定义函数时函数名后面括号中的变量名;
实际参数:调用函数时函数名后面括号中的表达式;

参数有两种传递方式:

值传递方式:

  函数调用时,为形参分配单元,并将实参的值复制到形参中

  调用结束,形参单元被释放,实参单元仍保留并维持原值;

特点

形参与实参占用不同的内存单元;  单向传递;

地址传递方式:

函数调用时,将数据的存储地址作为参数传递给形参;

特点:

形参与实参占用同样的存储单元;双向”传递;实参和形参必须是地址常量或变量;

变量的储存方式


各关键字相关内容在前文有详细叙述。


   m=max(a,max(b,c));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值