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);
posted @ 2016-03-09 11:08  墨隐于非  阅读(420)  评论(0编辑  收藏  举报