数组:相同数据类型变量的集合。数组是为用户处理多个数据而设计,使用数组可以给多个变量分配多个连续的内存,节省变量名的消耗。
数据类型 数组名[元素的个数];
例如: //int t10,t11,t12,t13,t14; int t[5]; //int b = 10; //int m[b]; //error 注意: (1)数据类型: char,short,int float,double,long ,long long (2)数组名: 合法的标识符,以数字,字符,下划线组成,首个单词要是字母或下划线 (3)元素个数: 要求是一个确定的常量值.
int t[5]; (1)数组的成员: t[0],t[1],t[2],t[3],t[4] (2)每个成员的类型:int (3)数组a的类型: int [5] (4)整个数组的大小: sizeof(int [5]) 或 sizeof(a) (5)数组一个元素的大小: sizeof(a[0]) (6)元素的个数: sizeof(a)/sizeof(a[0]) (7)数组名代表数组首元素的地址: a <======> &a[0] 思考:数组首地址t编译器是如何找到对应t[0],t[1],t[2]内存块的数据呢? t[0]=====> 表示数组的首地址a偏移0个元素的大小,[]取该地址中的内容 t[1]=====> 表示数组的首地址a偏移1个元素的大小,[]取该地址中的内容 t[2]=====> 表示数组的首地址a偏移2个元素的大小,[]取该地址中的内容 t[3]=====> 表示数组的首地址a偏移3个元素的大小,[]取该地址中的内容
#include <stdio.h> int main() { int a[5]; printf("sizeof(int [5]) = %ld\n",sizeof(int [5])); printf("sizeof(a) = %ld\n",sizeof(a)); printf("sizeof(a[0]) = %ld\n",sizeof(a[0])); printf("len = %ld\n",sizeof(a)/sizeof(a[0])); return 0; }
#include <stdio.h> int main() { int a[5]; //a[0]~a[4] int i = 0; int len = sizeof(a)/sizeof(a[0]); //5 /* scanf("%d",&a[0]); scanf("%d",&a[1]); scanf("%d",&a[2]); scanf("%d",&a[3]); scanf("%d",&a[4]); */ printf("please input %d data : \n",len); for(i = 0;i < len;i++) { scanf("%d",&a[i]); } for(i = 0;i < len;i++) { printf("%d ",a[i]); } printf("\n"); return 0; }
在定义数组的同时,给数组中的每一个成员变量,赋予一个初始的值。
例如: int a[5] = {10,20,30,40,50}; //a[0] = 10, a[1] = 20, a[2] = 30,a[3] = 40,a[4] = 50
例如: int a[5] = {10,20,30}; 部分初始化:未初始化的值,系统默认为0. //a[0] = 10, a[1] = 20, a[2] = 30,a[3] = 0,a[4] = 0 错误写法: int a[5] = 1,2,3,4,5; //error int a[5]; //a[0]~a[4] a[5] = {1,2,3,4,5}; //error int m = 5; int a[m]; //error
#include <stdio.h> int main() { int a[5] = {10,20,30,40,50}; int b[5] = {1,3,5}; int len = 5,i = 0; printf("a数组: "); for(i = 0;i < len;i++) { printf("%d ",a[i]); } printf("\n"); printf("===========================\n"); printf("b数组: "); for(i = 0;i < len;i++) { printf("%d ",b[i]); } printf("\n"); printf("===========================\n"); return 0; }
例如: int a[] = {10,20,30,40,50,60,70}; int len = sizeof(a)/sizeof(a[0]); //a[0] = 10 a[1] = 20 .... a[6] = 70; 特点:系统会根据用户初始化的元素个数来分配对应的内存空间。 常见错误: //int a[7]; //true //int a[]; //error //int a[] = {}; //error //int a[] = {5}; //true ,只有一个元素 a[0]
#include <stdio.h> int main() { int c[] = {1,3,4,5,6,7,2,3,4,5,6}; int i = 0,n = 0; int len = sizeof(c)/sizeof(c[0]); for(i = 0;i < len;i++) { printf("%d ",c[i]); if(c[i] % 2 == 0) n++; } printf("\n"); printf("偶数的个数 = %d\n",n); return 0; }
练习
int a[8] = {10,15,27,33,78,65}; (1)要求用户输出上述数组的内容 (2)要求求上述数组中奇数的和。 (3)求上述数据中所有元素(8个)的平均值,省略小数,输出整数。
#include <stdio.h> int main() { int a[8] = {10,15,27,33,78,65}; int length = sizeof(a)/sizeof(a[0]); int odd_sum = 0,average = 0,sum = 0; for (int i = 0; i < length; ++i) { // 要求用户输出上述数组的内容 printf("%d ",a[i]); // 要求求上述数组中奇数的和。 if (a[i] & 1) { odd_sum+=a[i]; } sum+=a[i]; } printf("\n"); printf("odd_sum = %d\n",odd_sum); // 所有元素(8个)的平均值,省略小数,输出整数 printf("average = %d\n",sum/length); return 0; }
字符数组: 它是一个char/unsigned char类型的数组,常用来存放字符或字符串。
char buf[5] = {'A','B','C','D','E'}; 思考:字符数组中只能存放字符或字符串,这句话对不对? 不对,还可以存放整数 char buf[5] = {65,66,67,68,69}; //true;
三种写法: char buf[30] = "welcome"; char buf[30] = {"welcome"}; char buf[30] = {'w','e','l','c','o','m','e','\0'};
#include <stdio.h> int main() { char buf1[] = {"hello"}; char buf2[] = "hello"; char buf3[] = {'h','e','l','l','o','\0'}; int i = 0; printf("buf1 : "); for(i = 0;buf1[i] != '\0';i++) { printf("%c ",buf1[i]); //输出单个字符 } printf("\n"); printf("===============================\n"); printf("buf2 : "); for(i = 0;buf2[i] != '\0';i++) { printf("%c ",buf2[i]); } printf("\n"); printf("===============================\n"); printf("buf3 : "); for(i = 0;buf3[i] != '\0';i++) { printf("%c ",buf3[i]); } printf("\n"); return 0; }
char buf[100] = {0}; scanf("%s",字符数组的首地址); //scanf("%s",buf); 功能:用户从键盘输入任意一段字符串,存放到buf中。以回车,空格,tab键盘作为用户输入的结束符号。
char buf[] = {"hello world"}; printf("%s\n",字符数组的首地址); //printf("%s\n",a); 功能: 输出数组中第一个'\0'之前所有的字符,并显示到屏幕上。 若是用户对应字符数组中没有'\0',则用户输出乱码.
#include <stdio.h> int main() { char name[100]; printf("please input your name : "); scanf("%s",name); //scanf("%s",&name[0]); printf("NAME\n"); printf("%s\n",name); // return 0; }
#include <stdio.h> int main() { /* char buf[1024] = {0}; buf[0] = 'h'; buf[1] = 'e'; buf[2] = 'l'; buf[3] = 'l'; buf[4] = 'o'; buf[5] = '\0' printf("buf = %s\n",buf); */ char buf[100] = {'h','e','l','\0','X','Y','Z','\0'}; printf("buf = %s\n",buf); return 0; }
练习
char buf[100] = {0}; 要求用户从键盘输入字符数串存放到buf中,若是用户输入的字符数组中存在大写字符, 则转换为小写字符,若是小写字符则不管,然后输出用户输入的数据
#include <stdio.h> int main() { char buf[100] = {0}; int tmp = 0; printf("请输入一些字符:\n"); scanf("%s",buf); for (int i = 0; i < sizeof(buf)/sizeof(buf[0]); ++i) { tmp = buf[i]; if (65 <= tmp && tmp <= 90) buf[i] += 32; } printf("%s\n",buf); return 0; }
通过课程学习熟练使用数组定义字符串,从终端输入字符到数组方式存储。继续努力再接再厉。