5.数组应用案例
- 创建一个 char 类型的 26 个元素的数组,分别 放置'A'-'Z‘。使用 for 循环访问所有元素并打印出来
//创建一个 char 类型的 26 个元素的数组,分别 放置'A' - 'Z‘。使用 for 循环访问所有元素并打印出来。 #include<stdio.h> void main() { char arr[26];//申明一个长度为26个char数据类型的数组 int i;//用于遍历数组,表明当前所正在遍历的数组的组号 for (i = 0; i < 26; i++) { arr[i] = 'A' + i; } for (i = 0; i < 26; i++) { printf("%c\n", arr[i]); } }
2. 请求出一个数组的最大值,并得到对应的下标
#include<stdio.h> void main() { int arr[7], i;//定义一个长度为7个int数据类型的数组,i用于遍历数组和输出当前下标 for (i = 0; i < sizeof(arr) / sizeof(int); i++) { printf("请输入要存入的数字:"); scanf_s("%d", &arr[i]); } //MAX用于存放最大值,MAXi存放数组中最大值的下标 //MAX默认为arr[0],即数组第一个数;MAXi为数组第一个数的下标 int MAX = arr[0], MAXi = 0; for (i = 0; i < sizeof(arr) / sizeof(int); i++) { if (MAX < arr[i]) { MAX = arr[i];//如果当前遍历的数组大于MAX中存放的数值,则将该值赋值给MAX MAXi = i;//用于保存该值的下标 } } printf("该数组中的最大值为%d,存放该最大值的数组下标为%d", MAX, MAXi); }
6.字符数组与字符串
6.1.字符数组基本介绍
1.
char a[10]; //一维字符数组, 长度为 10
2.
char b[5][10]; //二维字符数组
3.
char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值
4.字符数组实际上是一系列字符的集合,也就是字符串(String)。在 C语言中,没有专门的字符串变量,没有 string 类型,通常就用一个字符数组来存放一个字符串
6.2.字符串注意事项
- 在 C 语言中,字符串实际上是使用 null 字符 ('\0') 终止的一维字符数组。因此,一个以 null 结尾的字符串, 包含了组成字符串的字符(未定义完全的字符数组,在已定义的最后一个字符后的第一个字符中存入"\0",当计算机遍历到"\0"时,就知道该字符数组定义到上一个字符为止,不再继续向后遍历)
2.'\0'是ASCII 码表中的第 0 个字符,用NULL表示,称为空字符。该字符既不能显示,也不是控制字符,输出该字符不会有任何效果,它在 C 语言中仅作为字符串的结束标志
//在给某个字符数组赋值时,应当注意字符数组的大小 //如果刚好赋值的元素的个数刚好等于字符数组的长度 //则系统无法自动给已赋值的元素末尾加上\0 //此时如果输出该字符数组,则有可能导致输出错误 char str[3] = {'a','b','c'}; printf("str = &s", str);
3.在给某个字符数组赋值时,应当注意字符数组的大小。如果刚好赋值的元素的个数刚好等于字符数组的长度,则系统无法自动给已赋值的元素末尾加上\0,此时如果输出该字符数组,则有可能导致输出错误
6.3.字符串的访问和遍历
//按照数组方式遍历即可 #include<stdio.h> void main() { char arr[9] = "jiangnan"; int i; for (i = 0; i < sizeof(arr) / sizeof(char) - 1; i++) { printf("%c", arr[i]); } }
6.4.字符串的表达形式
6.4.1.用字符数组存放一个字符串
1.
char str[]="hello tom";
2.
char str2[] = {'h', 'e'};
6.4.2.用字符指针指向一个字符串
char* pStr=" hello tom";
1.C语言对字符串常量" hello tom"是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量 str 时,只是把字符串首地址(即存放字符串的字符数组的首地址)赋给 pStr(先定义了一篇内存内存,用来存放字符数组,再将存放该字符数组的内存空间的首地址赋值给pStr,使其指向该字符数组的首地址)
2.printf("%s\n",str); 可以输出 str 指向的字符串
3.
6.4.3.使用字符指针变量和字符数组两种方法表示字符串的讨论
- 字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首址)(字符数组存放的是各个元素的数据,而字符指针变量存放的是字符数组的首地址;它们的区别可以参考值传递和地址传递)
- 对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值(这样会改变了str自身的地址,因此不能用次方法对字符数组赋值)
char str[14]; str=" hello tom";//错误 str[0] = 'i'; //ok
str的本质上是一个常量,不可修改,且它是一个字符数组,而第二行代码中右边"hello tom"实质上是在内存中开辟了另一个新的内存空间,用于存放"hello tom"数组,如果这样赋值,str将会指向的是这一块新的内存空间,而不是开始定义的它本来的内存空间,即改变了它本身的地址
3.对字符指针变量,采用下面方法赋值, 是可以的(同样不能不改变自身的地址,但它是一个指针变量,它自身的内容就是地址,可以修改它的内容,即它所指向的地址,从而实现对字符数组的赋值)
char* a="yes"; a=" hello tom";
第一局代码定义了一个名为a的字符指针变量,并使其指向存放"yes"的字符数组的内存空间的首地址;第二句代码,使a改为指向存放"hello tom"的字符数组的内存空间的首地址
4
5.如果定义了一个字符数组,那么它有确定的内存地址(即字符数组名是一个常量),(即不能修改自身的地址);而定义一个字符指针变量时, 它并未指向某个确定的字符数据,并且可以多次赋值(同样不能修改自身地址,但它是一个指针变量,它自身的内容就是地址,可以修改它的内容,即它所指向的地址,从而达到多次赋值)
7.字符串相关函数
8.字符串(字符数组)使用注意事项和细节
- 程序中往往依靠检测 '\0' 的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。因此,字 符串长度不会统计 '\0', 字符数组长度会统计
- 在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度, 否则,在输出字符数组时可能出现未知字符如果字符串的实际长度等于数组的长度,那么将会没有位置放 "\0",程序也就检测不到"\0",即检测不到哪里是字符串的结束位置)
- 系统对字符串常量也自动加一个'\0'作为结束符。例如"C Program”共有 9 个字符,但在内存中占 10 个字节, 最后一个字节'\0'是系统自动加上的
- 定义字符数组时,如果 给的字符个数比数组的长度小,则系统会默认将剩余的元素空间,全部设置为 '\0', 比 如 char str[6] = "ab" , str 内存布局就是 [a][b][\0][\0][\0][\0]