维数组的定义和引用 31一维数组的定义和引用 义数组,就是要 (1)规定数组的名称,其取名规则与变量名相同 (2)规定数组的类型,包括其数据类型和存储类型 (3)规定数组的大小,即数组的维数及包含的数组元素的个数。数组元素就是包含在数组中 的变量。 维数组的定义 类型说明符数组名[exp] 例如: int data[10], number[5] 、一维数组元素的引 数组名[下标] 例如:a[0]=a[5]+a[7]一a[2*3] 维数组在内存中占一段连续的存储空间,其首地址:a或&a[0] 维数组的输入与输出 in t for(i=0;i=0;i--) printf(“%d”,a[i]) printf(“n
一维数组的定义和引用 3 . 1 一维数组的定义和引用 定义数组,就是要: (1)规定数组的名称,其取名规则与变量名相同; (2)规定数组的类型,包括其数据类型和存储类型; (3)规定数组的大小,即数组的维数及包含的数组元素的个数。数组元素就是包含在数组中 的变量。 一、一维数组的定义: 类型说明符 数组名[exp] ; 例如:int data[10], number[5]; 二、一维数组元素的引用 数组名[下标] 例如:a[0]=a[5]+a[7]-a[2*3] 一维数组在内存中占一段连续的存储空间,其首地址:a 或&a[0] 一维数组的输入与输出 main( ) { int i , a[10]; for(i=0; i=0; i - - ) printf(“%d ”,a[i]); printf(“\n”); }
一维数组的初始化 在定义数组时对数组元素赋以初值 inta[10]={0,1,2,3,4,5,6,7,8,9}; 2.可以只给一部分元素赋值:inta[10]={0,1,2,3,4}; 3.如果想使一个数组中全部元素值为0,可简便实现 inta[10]={0,0,0,0,0,0,0,0,0,0} 其实,对 static数组不赋初值,系统会对所有数组元素自动赋以0值,即上句等价 static int a[10] 4.C允许通过所赋初值的个数来隐含定义一维数组的大小:int a[]={0,1,2,3,4,5,0} 相当于 inta[7]={0,1,2, 二维数组的定义和引用 32二维数组的定义和引用 、二维数组的定义 类型说明符 数组名[exp1][exp2] 如: int number[5][4]; char ch[3][4], name[8] 数组的存储结构:以行为主序的连续空间 、二维数组的引用 二维数组元素的表示形式为:数组名[下标][下标] 如:a[2][3]、b[1][2]=a[2][3]/2、a[2][3]=3等
三、一维数组的初始化 1. 在定义数组时对数组元素赋以初值; int a[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 2. 可以只给一部分元素赋值; int a[10]={0, 1, 2, 3, 4}; 3. 如果想使一个数组中全部元素值为 0,可简便实现; int a[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 其实,对 static 数组不赋初值,系统会对所有数组元素自动赋以 0 值,即上句等价 于: static int a[10]; 4. C 允许通过所赋初值的个数来隐含定义一维数组的大小;int a[]={0,1,2,3,4,5,0}; 相当于 int a[7]={0,1,2,3,4,5,0}; 二维数组的定义和引用 3 . 2 二维数组的定义和引用 一、二维数组的定义 类型说明符 数组名[exp1][exp2]; 如:int number[5][4]; char ch[3][4], name[8]; 数组的存储结构:以行为主序的连续空间 二、二维数组的引用 二维数组元素的表示形式为:数组名[下标][下标] 如:a[2][3]、b[1][2]=a[2][3]/2、a[2][3]=3 等;
注意: 1)其中下标可以是整型表达式; 2)不要写成a[2,3]等形式; 3)应该注意下标值应在已定义的数组大小范围内 4)定义数组时用的a[3][4]与引用数组元素时用的a[3][4]的区别。 、二维数组的初始化 1.分行给二维数组赋初值:如 static int a[3][4]={1,2,3,4},{5,6,7,8},{9,10,11,12} 2.可以将所有数据写在一个花括号内,按数组排列的顺序对元素赋初值;如 static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} 3.如果花括号内的初值个数少于每行中的数组元素个数,则每行中后面的元素自动赋初值0 也允许代表给每行元素赋初值的花括号的数目少于数组的行数,这时,后面各行的元素也自动赋0 static int a[3][4]={1},{5},{9}} 等价于 static int a[3][4]={1,0,0,0},{5,0,0,0},{9,0,0,0}; 而 static int a[4][3]={1,2},{4,5};等价于 static int a[4][3]={1,2,0},{4,5,0},{0,0,0)},{0,0,0} 4.C语言规定,可以用初始化的方法来隐含定义二维数组第一维的大小,即可以省略数组定 义中第一个方括号中的表达式,但不能省略第二个方括号中的表达式。如: static int a[3][4]={1,2,3,4,5,6,7,8,9,10,1,12) 等价于 static int a[][4={1,2,3,4,5,6,7,8,9,10,1,12}; 在定义时也可以只对部分元素赋初值而省略第一维长度,但应分行赋初值。如: static int a[[4]={0,0,3},(0},0,10)}; 四、二维数组的输入与输出 用二重循环,以a[m][n]为例 for (i=0:i<m: i++) for(j=0; j<n: j++)
注意: 1) 其中下标可以是整型表达式; 2) 不要写成 a[2,3]等形式; 3) 应该注意下标值应在已定义的数组大小范围内; 4) 定义数组时用的 a[3][4]与引用数组元素时用的 a[3][4]的区别。 三、二维数组的初始化 1. 分行给二维数组赋初值:如 static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 2. 可以将所有数据写在一个花括号内,按数组排列的顺序对元素赋初值;如: static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 3. 如果花括号内的初值个数少于每行中的数组元素个数,则每行中后面的元素自动赋初值 0; 也允许代表给每行元素赋初值的花括号的数目少于数组的行数,这时,后面各行的元素也自动赋 0 值。如: static int a[3][4]={{1},{5},{9}}; 等价于 static int a[3][4]={{1,0,0,0},{5,0,0,0},{9,0,0,0}}; 而 static int a[4][3]={{1,2},{4,5}}; 等价于 static int a[4][3]={{1,2,0},{4,5,0},{0,0,0},{0,0,0}}; 4. C 语言规定,可以用初始化的方法来隐含定义二维数组第一维的大小,即可以省略数组定 义中第一个方括号中的表达式,但不能省略第二个方括号中的表达式。如:static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 等价于 static int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 在定义时也可以只对部分元素赋初值而省略第一维长度,但应分行赋初值。如: static int a[ ][4]={{0,0,3},{0},{0,10}}; 四、二维数组的输入与输出 用二重循环,以 a[m][n]为例 for(i=0;i<m;i++) for(j=0;j<n;j++) {……}
字符数组和字符串 3.3字符数组和字符串 、字符数组的定义 char数组名[exp] 如: char c[10] 、字符数组的初始化 1.给每一个字符型数组元素依次赋给一个单字符 如: char str[6]={C’,"h’,i’,n’,‘a’,“0’ 2.直接在赋值号右边给出字符串常量。如 char str[6]=“ China” 注意: )字符数组的长度可以通过赋初值的方式隐含定义:如: har str[]= char str[]=“ China b)如果括号中提供的初值个数(即字符个数)大于数组长度,则作语法错误处理。如果初 值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定义为空字符(即 10’)。 字符数组的引用 static char c[12]=“ I am a boy.” for(i=0;i<12;i++) printf(“%c”,c[i]); printf(“n”) 四、字符串和字符串结束标志
字符数组和字符串 3 . 3 字符数组和字符串 一、字符数组的定义 char 数组名[exp]; 如:char c[10]; 二、字符数组的初始化 1. 给每一个字符型数组元素依次赋给一个单字符。 如:char str[6]={‘C’, ‘h’, ‘i’, ‘n’, ‘a’, ‘\0’}; 2. 直接在赋值号右边给出字符串常量。如: char str[6]=“China”; 注意: a) 字符数组的长度可以通过赋初值的方式隐含定义;如: char str[ ]={‘C’, ‘h’, ‘i’, ‘n’, ‘a’, ‘\0’}; char str[ ]=“China”; b) 如果括号中提供的初值个数(即字符个数)大于数组长度,则作语法错误处理。如果初 值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定义为空字符(即 ‘\0’)。 三、字符数组的引用 例:main( ) { static char c[12]=“I am a boy.”; int i; for (i=0;i<12;i++) printf(“%c”,c[i]); printf(“\n”); } 四、字符串和字符串结束标志
字符串结束标志是“\0”,如: char ch[]=” China China”在存储器中实际占用6个字节: 五、字符数组的输入和输出 1、字符数组的输出 (1)用格式符“%c”控制的 printf():如: static char c[12]={‘I for(i=0;i Inden static char city[]=“ YangZhou” for(i=0;i<=8:;i++) printf(“%c”,city[i]) print printf(“%sn”,city) (1)puts用字符数组名,而不用数组元素名 (2)输出的字符串中可含转义字符:如 static char str[]=“ China\ nBeijing” puts(str)
字符串结束标志是“\0”,如: char ch[]=”China”; “China”在存储器中实际占用 6 个字节: 五、字符数组的输入和输出 1、字符数组的输出 (1)用格式符“%c”控制的 printf();如: main() { static char c[12]={‘I’,‘ ’, ‘a’, ‘m’,‘ ’, ‘a’, ‘ ’, ‘b’, ‘o’, ‘y’, ‘.’}; int i; for( i=0; i main ( ) { static char city[ ]=“YangZhou”; int i, j; for (i=0;i<=8;i++) printf (“%c”,city[i]); printf (“\n”); printf (“%s\n”,city); puts(city); } 注意: (1)puts 用字符数组名,而不用数组元素名; (2)输出的字符串中可含转义字符;如: static char str[]=“China\nBeijing”; puts(str);
(3)如果数组长度大于字符串实际长度,也只输出到遇‘\0’时结束(即若一个字符数组中 包含一个以上的“\0’,则遇到第一个时输出就结束)。如: printf(“%sn ABCD\ OEFGH”):只输出ABCD 字符数组的输入 (1)用格式符“%s”控制的 scanf(): 如: static char c[6]: scanf(“%s”,c) 再如 tatic char strl[5], str2[5], str 3 [51 scanf(“%s%s%s”,strl,str2,str3);/*不能写成&str1*/ 输入数据流为: How are you? tr1、str2、str3分别接收到“How”、“are”、“you?”, 且在各个字符串的最后自动加“\0 如果利用一个 scanf函数输入多个字符串时,则以空格分隔 (2)用gets() char ch[16]: gets(ch) 注意 ①gets一次只能输入一个字符串; ②自变量应是数组名,而不能是数组元素名 ③要求从键盘上输入一个字符串直到遇到换行符为止,系统会自动把换行符换成“\0”加在字符串末 与 scanf不同,输入字符串中的空格也会被接收。 字符串处理函数 puts(字符数组) 功能:将一个以“\0’结束的字符序列输出到终端 static char str[]=“ China”:puts(str); 说明:输出的字符串中可含转义字符
(3)如果数组长度大于字符串实际长度,也只输出到遇‘\0’时结束(即若一个字符数组中 包含一个以上的‘\0’,则遇到第一个时输出就结束)。如:printf(“%s\n”, “ABCD\0EFGH”); 只输出 ABCD 2、字符数组的输入 (1)用格式符“%s”控制的 scanf(); 如:static char c[6]; scanf(“%s”,c); 再如: static char str1[5],str2[5],str3[5]; scanf(“%s%s%s”, str1,str2,str3); /*不能写成&str1*/ 若输入数据流为:How are you? str1、str2、str3 分别接收到“How”、“are”、“you?”, 且在各个字符串的最后自动加‘\0’。 如果利用一个 scanf 函数输入多个字符串时,则以空格分隔; (2)用 gets( );如: char ch[16]; gets(ch); 注意: ①gets 一次只能输入一个字符串; ②自变量应是数组名,而不能是数组元素名; ③要求从键盘上输入一个字符串直到遇到换行符为止,系统会自动把换行符换成“\0”加在字符串末 尾。 与 scanf 不同,输入字符串中的空格也会被接收。 六、字符串处理函数 1、puts(字符数组) 功能:将一个以‘\0’结束的字符序列输出到终端; 如: static char str[ ]=“China”;puts(str); 说明:输出的字符串中可含转义字符
gets(字符数组) 功能:从终端输入一个字符串到字符数组中,并得到一个函数值,该函数值是字符数组的起 始地址 gets(str) 说明:gets与puts只能输入或输出一个字符串。 strcat(字符数组1,字符数组2) 功能:将字符串2接到字符串1的后而且去掉字符串1的尾空 如: static char strl[30]=“ YangZhou str2[]=“ China” printf(“%sn”, strcat(str1,str2)) 说明 ①字符数组1的长度需足够大:②去掉字符串1的尾空。 4、 strcpy(字符数组1,字符串2) 功能:将字符串2拷贝到字符数组1中去; static char strl[10],str2[]=“ China”; strcpy (strl, str2) 字符数组1的长度需足够大 字符数组1必须写成数组名形式,字符串2可以是数组名,也可以是一个字符串常量。如: trap(strl,“ China”) 拷贝时连同字符串2后的“\0’一起拷贝 不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。如:str1= China strl=str2;一一均是错误的 若只想拷贝str2的前面若干个字符(如2个字符),则可用 strncpy函数。 strncpy(str1,str2
2、gets(字符数组) 功能:从终端输入一个字符串到字符数组中,并得到一个函数值,该函数值是字符数组的起 始地址; 如: gets(str); 说明:gets 与 puts 只能输入或输出一个字符串。 3、strcat(字符数组 1,字符数组 2) 功能:将字符串 2 接到字符串 1 的后而且去掉字符串 1 的尾空; 如: static char str1[30]=“YangZhou ”, str2[ ]=“China”; printf(“%s\n”,strcat(str1,str2)); 说明: ①字符数组 1 的长度需足够大; ②去掉字符串 1 的尾空。 4、strcpy(字符数组 1, 字符串 2) 功能:将字符串 2 拷贝到字符数组 1 中去; 如: static char str1[10],str2[ ]=“China”; strcpy (str1,str2); 说明: 字符数组 1 的长度需足够大; 字符数组 1 必须写成数组名形式,字符串 2 可以是数组名,也可以是一个字符串常量。如: strcpy(str1,“China”); 拷贝时连同字符串 2 后的‘\0’一起拷贝; 不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。如:str1= “China”; str1=str2; ——均是错误的。 若只想拷贝 str2 的前面若干个字符(如 2 个字符),则可用 strncpy 函数。strncpy(str1,str2, 2);
5、 strcmp(字符串1,字符串2) 功能:比较字符串1和字符串2,返回 ①串1=串2,返回0: ②串1>串2,返回正整数 ③串1<串2,返回负整数。 if( strcmp(str1,str2)==0) printf(“yes”); 说明:不能进行如下比较: f(str1==str2) printf(“yes”); 6、 strlen(字符数组) 功能:测试字符串的长 fn static char strl[10] China printf(“%d\n”, strlen(str) 说明:不包含‘\0’在内。特殊字符%%、\、\\、n代表一个字符 strlwr(字符串) 功能:将字符串中的大写字母转换成小写字母 说明:1wr: lowercase struer(字符数组) 功能:将字符串中的小写字母转换成大写字母。 说明:upr: uppercase
5、strcmp(字符串 1,字符串 2) 功能:比较字符串 1 和字符串 2,返回: ①串 1= 串 2,返回 0; ②串 1>串 2,返回正整数; ③串 1<串 2,返回负整数。 如: if(strcmp(str1,str2)= =0) printf(“yes”); 说明:不能进行如下比较: if(str1= =str2) printf(“yes”); 6、strlen(字符数组) 功能:测试字符串的长度; 如: static char str1[10]= “China”; printf(“%d\n”,strlen(str)); 说明:不包含‘\0’在内。特殊字符%%、\’、\\、\n 代表一个字符。 7、strlwr(字符串) 功能:将字符串中的大写字母转换成小写字母; 说明:lwr: lowercase。 8、strupr(字符数组) 功能:将字符串中的小写字母转换成大写字母。 说明:upr: uppercase
指针的概念 3.4指针的概念 计算机的主存储器被分成一个个存储单元,为了区分各存储单元,要为每个存储单元编号,这 编号即地址。 例:i=3;或 scanf(“%d”,&i) 是将3送给i所在的空间。 例:将3送到变量I_ pointer所“指向”的单元(即I所标志的单元)。 所谓“指向”,是通过地址来体现的, Ipointer中的值为2000,它是变量I的地址,这样 就在 I_ pointer和变量之间建立起一种联系,即通过 I_ pointer能知道I的地址,从而找到变量I 内存单元。因而在C语言中,将地址形象化地称为“指针” 意思是通过它能找到以它为地址的内存单元。一个变量的地址称为该变量的“指针”。 内存单元的地址和内存单元的内容是两个不同的概念。 指针:就是地址,即内存单元的编号。 指针变量:用来存放另一变量的地址(即指针)的变量 如:地址2000是变量i的指针:i_ pointer是指针变量,其值就是指针2000 指针变量的定义和引用 35指针变量的定义和引用
指针的概念 3 . 4 指针的概念 计算机的主存储器被分成一个个存储单元,为了区分各存储单元,要为每个存储单元编号,这 个编号即地址。 例:i =3;或 scanf(“%d”, &i); 是将 3 送给 i 所在的空间。 例:将 3 送到变量 I_pointer 所“指向”的单元(即 I 所标志的单元)。 所谓“指向”,是通过地址来体现的,I_pointer 中的值为 2000,它是变量 I 的地址,这样 就在 I_pointer 和变量之间建立起一种联系,即通过 I_pointer 能知道 I 的地址,从而找到变量 I 的 内存单元。因而在 C 语言中,将地址形象化地称为“指针”。 意思是通过它能找到以它为地址的内存单元。一个变量的地址称为该变量的“指针”。 内存单元的地址和内存单元的内容是两个不同的概念。 指针:就是地址,即内存单元的编号。 指针变量:用来存放另一变量的地址(即指针)的变量。 如:地址 2000 是变量 i 的指针;i_pointer 是指针变量,其值就是指针 2000。 指针变量的定义和引用 3 . 5 指针变量的定义和引用
、定义一个指针变量 指针变量的定义包含三个方面的内容 (1)指针类型说明,即定义变量为一个指针变量 (2)指针变量名 (3)变量值(指针)所指向的变量的数据类型。 格式 存储类型 基类型*指针变量名 例:int* pointer1,半 pointer2 float **pointer 3: char *pointer 4 、指针的引用 指针变量有两个运算符: &:取地址运算符 功能:取变量地址;单目,右结合。 *:取内容运算符(“间接访问”运算符) 功能:只能跟地址,取变量所指向单元的内容:单目,右结合。 例:&a为变量a的地址 *p为指针变量p所指向的存储单元。 例:int printf main nt *pointer l, *pointer pointer 1=& /*把变量a的地址赋给 pointer1*/ pointer 2=&b /*把变量b的地址赋给 pointer2*/ printf(“%d,%dn”,a,b)
一、定义一个指针变量 指针变量的定义包含三个方面的内容: ⑴ 指针类型说明,即定义变量为一个指针变量 ⑵ 指针变量名 ⑶ 变量值(指针)所指向的变量的数据类型。 格式: 存储类型 基类型 *指针变量名; 例:int *pointer_1, *pointer_2; float *pointer_3; char *pointer_4; 二、指针的引用 指针变量有两个运算符: & :取地址运算符 功能:取变量地址;单目,右结合。 * :取内容运算符(“间接访问”运算符) 功能:只能跟地址,取变量所指向单元的内容;单目,右结合。 例:&a 为变量 a 的地址, *p 为指针变量 p 所指向的存储单元。 例:int a=5, *p=&a; printf ( “%d”, *p ); main() { int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1=&a; /*把变量 a 的地址赋给 pointer_1*/ pointer_2=&b; /*把变量 b 的地址赋给 pointer_2*/ printf(“%d,%d\n”,a,b);