iOS学习04C语言数组
1、一维数组
数组:具有相同类型的成员组成的一组数据
1> 定义
元素:数组中存放的数据成为数组的元素
数组是构造类型,用{...}来给构造类型赋初始值,类型修饰符用来表示元素的类型
类型修饰符 数组名[数组元素个数] = {值1,值2,值3....};
定义的形式:
第一种形式
1 int ageArray[5] = {18, 22, 22, 1001, 1};
第二种形式
数据个数 > 设置初始值的个数,没有初始值的元素默认是0
1 int ageArray1[5] = {22, 23, 29};
第三种形式
1 int ageArray2[5] = {0};
第四种形式
根据设置的初始值来推断元素个数
1 int ageArray3[] = {22, 18, 19, 16, 23};
变量作为下标定义数组时,不能初始化
1 int num = 3; 2 // [变量] 不能赋初始值 3 int array[num]; 4 for (int i = 0; i < 3 ; i++) { 5 array[i] = i; 6 printf("%d ", array[i]); 7 }
定义数组的错误形式
内存溢出:定义的初始值的个数 > 数据个数
1 int heightArray[5] = {184, 183, 160, 168, 160, 190};
2> 数组的存储空间
数组在存储时申请的是一块连续的存储空间
数组的存储空间 = 元素个数 * 每一个元素所占的空间大小
1 int array[5] = {1, 2, 3, 4, 5}; 2 printf("sizeArray = %lu\n", sizeof(array));
3> 数组的访问 [常量或者是变量]
数组名[下标] 下标的范围:0~n-1, n 代表数组元素个数
1 int ageArray[5] = {27, 18, 22, 23, 32}; 2 printf("wanghai = %d\n", ageArray[4]); 3 printf("yanping = %d\n", ageArray[1]);
使用循环访问数组中所有的元素(数组遍历,通常和for循环结合使用)
1 for (int i = 0; i < 5; i++) { 2 printf("age = %d\n", ageArray[i]); 3 }
访问越界
1 double weightArray[5] = {104, 144, 189, 96, 0, 60}; 2 for (int i = 0; i < 5; i++) { 3 printf("weight = %.2f\n", weightArray[i]); 4 } 5 printf("%.2f", weightArray[5]); // 访问越界
练习:复制一个数组,即两个数组容量一样,把其中一个数组中的元素复制到另外一个数组中
1 int array1[5] = {1, 2, 3, 4, 5}; 2 int array2[5] = {0}; 3 //array2 = array1; 4 // 数组不能整体赋值 5 for (int i = 0; i < 5; i++) { 6 array2[i] = array1[i]; 7 printf("array2[%d] = %d\n", i, array2[i]); 8 }
2、冒泡排序
排序的规律:升序、降序
基本思路:每次相邻的两个元素比较,按照升序或降序的顺序交换位置,直到所有的元素位置全部正确
至少需要两层循环
外层循环控制比较的趟数
内存循环控制比较的次数
1 int array[5] = {9, 3, 8, 1, 5}; 2 // 控制循环的趟数 3 for (int i = 0; i < 5 - 1; i++) { 4 // 控制每趟比较的次数 5 for (int j = 0; j < 5 - i - 1; j++) { 6 // 比较相邻的两个元素 7 if (array[j] > array[j + 1]) { 8 // 交换两个元素的位置 9 int temp = array[j]; 10 array[j] = array[j + 1]; 11 array[j + 1] = temp; 12 } 13 } 14 } 15 // 遍历数组输出 16 for (int i = 0; i < 5; i++) { 17 printf("%d ", array[i]); 18 }
3、字符数组
1> 定义
1 char array1[5] = {'h', 'e', 'l', 'l', 'o'}; 2 3 // 未设置的元素默认是0 4 char array2[10] = {'w', 'o', 'r', 'l', 'd'}; 5 6 char array3[5] = {0}; 7 8 char array[] = {'i', 'P', 'h', 'o', 'n', 'e'};
2> 字符串
1 char array[] = "iPhone"; 2 // 相当于 3 char array1[] = {'i', 'P', 'h', 'o', 'n', 'e', '\0'};
字符串以 '\0' 结尾,字符串的本质就是字符数组
访问字符串
1 // 访问单个字符 2 char array[] = "iPhone"; 3 for (int i = 0; i < sizeof(array); i++) { 4 printf("%c ", array[i]); 5 }
1 // 整体访问 2 char array1[] = {'i', 'P', 'h', 'o', 'n', 'e', '\0'}; 3 printf("%s\n", array1);
3> 字符串和字符数组的区别
字符串就是一个字符数组
1 char a[] = "iPad"; 2 char b[] = {'i', 'P', 'a', 'd', '\0'};
数组a和数组b等价
字符数组不一定是字符串
1 char c[] = {'l', 'a', 'n', 'o', 'u'}; 2 char d[] = "lanou";
c和d不等价,数组 c 包含5个有效字符,数组 d 包含6个字符,其中有5个有效字符, '\0' 是结束标识符
4.字符串操作函数
strlen():计算字符串有效字符的个数
1 char array[] = "iPhone"; 2 unsigned long length = strlen(array); 3 printf("length = %lu\n", length); 4 5 char array1[] = "iMac"; 6 int length1 = (int)strlen(array1); // 类型强转 7 printf("length1 = %d\n", length1);
strcpy 字符串拷贝:strcpy(字符串1,字符串2);
把字符串2的内容拷贝到字符串1中
字符串1的长度 >= 字符串2的长度
1 char array1[] = "lanou"; 2 char array2[10] = {0}; 3 strcpy(array2, array1); 4 printf("array2 = %s\n", array2);
strcat字符串拼接:strcat(字符串1,字符串2);
把字符串2的内容拼接到字符串1后面,结果保存在字符串1中
字符串1的存储空间要足够大
1 char array1[30] = "lanou"; 2 char array2[] = "keji"; 3 strcat(array1, array2); 4 printf("array1 = %s, array2 = %s\n", array1, array2);
strcmp()字符串比较:strcmp(字符串1, 字符串2)
按照自左向右的顺序逐个字符比较(比较字符的ASCII值),直到遇到第一个不同的字符或者 '\0' 结束。
结果 > 0 字符串1 > 字符串2
结果 < 0 字符串1 < 字符串2
结果 = 0 字符串1 = 字符串2
1 char array1[] = "lanou"; 2 char array2[] = "keji"; 3 printf("%d\n", strcmp(array1, array2)); 5 char array[10] = "iPhone"; 6 printf("%lu\n", sizeof(array));
练习:将字符串 倒转
例如:“afjnpue”转变成字符串“eupnjfa”
(注:是改变 字符串本身,不是 反向输出)
1 char array[] = "afjnpue"; 2 int length = (int)strlen(array); 3 for (int i = 0; i < length / 2; i++) { 4 5 int temp = array[i]; 6 array[i] = array[length - 1 - i]; 7 array[length - 1 - i] = temp; 8 9 } 10 printf("%s\n", array);
4、宏定义
无参的宏
#define 宏名称 定义的值
宏命名: 1.k+驼峰命名法 2.字母全部大写
#define kPrint printf("Hello World!\n") #define COUNT 10
有参的宏
1 #define MUL(A, B) ((A) * (B)) 2 3 // 2 * 3 4 int result = MUL(2, 3); 5 printf("result = %d\n", result); 6 7 //(3 - 1) * (4 + 2) 8 int result1 = MUL(3 - 1, 4 + 2); 9 printf("result1 = %d\n", result1);