2017.11.13 c语言基础(二)

来源:互联网 发布:普华永道 55亿 知乎 编辑:程序博客网 时间:2024/06/07 15:42

 本次学习有一维数组,二维数组,字符数组,函数和预处理。

1.一维数组的定义格式为:

类型说明符  数组名[常量表达式];  例如:  int a[10];  
它表示定义了一个整形数组,数组名为a,有10个元素。
2.在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。
3.常量表达式中可以包括常量和符号常量,但不能包含变量。
注意:
C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
数组说明中其他常见的错误:
① float a[0];    /* 数组大小为0没有意义 */
② int b(2)(3);   /* 不能使用圆括号 */

③ int k, a[k];   /* 不能用变量说明数组大小*/    

2.一维数组: float mark[100];
每个数据元素占用的字节数,就是基类型的字节数一个元素占4个字节。

(1.在定义数组时对数组元素赋以初值。
例如:int a[10]={0,1,2,3,4,5,6,7,8,9};
(2. 可以只给一部分元素赋值。例如: 
 int a[10]={0,1,2,3,4};    
定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。
(3. 如果想使一个数组中全部元素值为0,可以写成:
      int  a[10]={0,0,0,0,0,0,0,0,0,0};   
     或int a[10]={0};
      不能写成:int a[10]={0*10};

(4. 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。
   例如:int a[5]={1,2,3,4,5};
   也可以写成  int a[]={1,2,3,4,5};  
   int a[10]={1,2,3,4,5};  只初始化前5个元素,后5个元素为0。
(5.数组的地址,a和&a


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


类型说明符  数组名[常量表达式][常量表达式];
例如:
定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组。
如下:float  a[3][4],b[5][10] ;
注意:我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。
例如:可以把a看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。

数据类型 :
数组名 [常量表达式1][常量表达式2]={ 初始化数据 };

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};
3.可以对部分元素赋初值。
例如: int a[3][4]={{1}, {5}, {9}};也可以对各行中的某一元素赋初值,如int a[3][4]={{1}, {0,6}, {0, 0, 0, 11}}; 


4.如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
例如:
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];
  c[0]=′I′ ;  c[1]=′ ′;   c[2[=′a′;   c[3]=′m′;
  c[4]=′ ′;   c[5]=′h′;  c[6]=′a′;   c[7]=′p′;
  c[8]=′p′;   c[9]=′y′;
对字符数组初始化,可逐个字符赋给数组中各元素。
例如:
char c[10]={‘I’, ‘’,‘a’,‘m’,‘’,‘h’,‘a’,‘p’, ‘p’,‘y’} 
为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”——‘\0’。

字符数组的输入输出可以有两种方法:
逐个字符输入输出。用格式符“%c”输入或输出一个字符。
将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。 

说明:
(1)用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。
(2)如果数组长度大于字符串实际长度,也只输出到遇′\0′结束。
(3)输出字符不包括结束符′\0′。
(4)如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束。 
(5)可以用scanf函数输入一个字符串。
如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔。
例如:scanf(″%s %s %s″,str1,str2,str3);
输入数据:How are you? 
数组中未被赋值的元素的值自动置′\0′。
1. puts函数
其一般形式为:  puts (字符数组)
其作用是将一个字符串(以′\0′结束的字符序列)输出到终端。
假如已定义str是一个字符数组名,且该数组已被初始化为"China"。则执行puts(str);其结果是在终端上输出China。

2. gets函数
其一般形式为:gets(字符数组)
  其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。
如执行下面的函数:     gets(str)
从键盘输入:
Computer↙将输入的字符串"Computer"送给字符数组str

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

4. strcpy函数 
其一般形式为:strcpy(字符数组1,字符串2) 
strcpy是“字符串复制函数”。
作用:是将字符串2复制到字符数组1中去。例如:
char str1[10],str2[]={″China″};
strcpy(str1,”china”); 

说明:

(1)字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。
(2)“字符数组1”必须写成数组名形式(如str1),
“字符串2”可以是字符数组名,也可以是一个字符串常量。如:strcpy(str1,″China″); 
(3)复制时连同字符串后面的′\0′一起复制到字符数组1中。
(4)可以用strncpy函数将字符串2中前面若干个字符复制到字符数组1中去。
例如:strncpy(str1,str2,2);作用是将str2中前面2个字符复制到str1中去,然后再加一个‘\0’。 

(5)不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如:
   str1=″China″;  不合法
   str1=str2;       不合法
用strcpy函数只能将一个字符串复制到另一个字符数组中去。
用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。

5. strcmp函数 
其一般形式为:strcmp(字符串1,字符串2) 
strcmp的作用是比较字符串1和字符串2。
例如:strcmp(str1,str2);
      strcmp(″China″,″Korea″);
      strcmp(str1,″Beijing″);

6. strlen函数 
其一般形式为: strlen (字符数组) 
strlen是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括′\0′在内)。
例如:char str[10]={″China″};
    printf(″%d″,strlen(str));

7. strlwr函数 
其一般形式为:strlwr (字符串) 
strlwr函数的作用是将字符串中大写字母换成小写字母。


8. strupr函数 
其一般形式为:strupr (字符串) 
strupr函数的作用是将字符串中小写字母换成大写字母。 



C程序:
只包含一个主函数main()
也可以包含一个主函数和若干个其它函数(库函数和自定义函数)


函数类型     函数名(形式参数类型说明表)
{
声明部分
执行部分
}
函数调用:
函数类型     函数名(形式参数类型说明表)
{
声明部分
执行部分
}
如:
printf(“Hello,World!\n”);
max(10,20);

函数调用的形式:
(1)作为函数语句调用。函数一般无返回值。例:
printf(“Hello,World!\n”);
(2)作为函数表达式调用。例:
m=max(a,b)*2;
(3)作为函数参数调用。例:
printf(“%d”,max(a,b));
   m=max(a,max(b,c));

形参与实参
形式参数:定义函数时函数名后面括号中的变量名
实际参数:调用函数时函数名后面括号中的表达式
例 比较两个数并输出大者

值传递方式方式:
  函数调用时,为形参分配单元,并将实参的值复制到形参中;
  调用结束,形参单元被释放,实参单元仍保留并维持原值;
特点:
形参与实参占用不同的内存单元;  单向传递地址传递方式:
函数调用时,将数据的存储地址作为参数传递给形参
特点:
形参与实参占用同样的存储单元;
“双向”传递;
实参和形参必须是地址常量或变量;

自动变量是最常用的。 关键字auto能够显式地指定存储类别。
               显式定义         auto int x,y;


               隐含定义    等价       int x,y;


    实际上关键字“auto”可以省略,auto不写则隐含确定为“自动存储类别”,即动态存储方式。


    程序中大多数变量属于自动变量。


以上 就是本次知识点!