iOS开发技能树之C语言-数组、字符串

数组基本定义

数组可以用来存储一组有序的数据。数组是一块连续的、大小固定并且里面的数据类型一直的内存空间。

1、 声明数组一般式:

数据类型 数组名称[长度];

int grades[20]; //声明一个能够存储20个int类型数据的数组。

2、 初始化数组:

1、数据类型 数组名称[长度n] = {元素1,元素2...元素n};//也可以只初始化一部分值 数据类型 数组名称[长度n] = {元素1,元素2};其余元素初始化为0
    int grades[3] = {1,2,3}; // int grades[3] = {1};
2、数据类型 数组名称[] = {元素1,元素2...元素n};
    int grades[] = {1,2,3};
3、数据类型 数组名称[长度n] ;数组名称[0]=元素1;数组名称[1]=元素2;数组名称[n-1]=元素n;
    int grades[3] ;
    grades[0]=1;grades[1]=2;grades[2]=3;

数组在初始化的时候,数组内元素个数不能大于声明数组的长度。

3、 数组取值

数组是一组有序的数据结构,所以通过下标来取对应的值。

数组名称[元素对应下标]

1、数组下标从0开始,最后一个元素下标是数组长度n-1。即x号元素对应的是第(x+1)个元素。
C语言中数组长度一旦声明,长度就是固定无法改变

4、 数组遍历

数组遍历就是采用循环的方式将数组中的每个元素遍历出来。前面集中循环的方式都可以用来遍历,但有点注意的地方:避免数组越界访问,即循环变量不要超出数组长度。

C语言中的数组长度声明之后是固定的,并且C语言中没有计算数组长度的方法。

int arra[10] = {1,4,4,6,7,8,9,12};
for (int i = 0; i < 10; i ++) {
    printf("%d\n",arra[i]);
}

5、数组排序-冒泡排序

升序排序为例:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。

int grades[10] = {89,45,67,67,45,43,78,90,50,20};
for (int i = 0; i < 10; i ++) {
    printf("%d ",grades[i]);
}

for (int i = 0; i < 9; i ++) {
    for (int j = i; j >= 0; j --) {
        if (grades[j] > grades[j+1]) {
            int temp = grades[j];
            grades[j] = grades[j+1];
            grades[j + 1] = temp;
        }
    }
}


printf("\n ---- 排序 ------\n");
for (int i = 0; i < 10; i ++) {
    printf("%d ",grades[i]);
}
printf("\n");

打印结果:
89 45 67 67 45 43 78 90 50 20 
 ---- 排序 ------
20 43 45 45 50 67 67 78 89 90 

另外一种写法(原理一样):
//    for (int i = 8; i >= 0; i --) {
//        for (int j = 0; j <= i; j ++) {
//            if (grades[j] > grades[j+1]) {
//                int temp = grades[j];
//                grades[j] = grades[j+1];
//                grades[j+1] = temp;
//            }
//        }
//    }

多维数组

  • 一般定义式:
数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n];
  • 初始化方法:
1、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n] = {{值1,...值n},{值1,...值n}...{值1,...值n},}; //必须制定列的维数,因为心痛会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数

2、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n];
    数组名称[下标1][下标2]..[下标n] = 值;
//必须同时指定行和列的维数。
  • 取值
    与一维数组一样通过下标取值,多为数组需要通过多个维度的下标值确定取值位置。
int arr[3][3] = {
        {1,2,3},
        {4,5,6},
        {7,8,9}};
int index = arr[0][0];

同样每个维度上都不能越界。

  • 遍历
    通过嵌套循环实现多维数组的遍历。

多维数组的每一维下标决不能越界。

int arr[3][3] = {
        {1,2,3},
        {4,5,6},
        {7,8,9}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
    for (j = 0; j<3; j++) {
        if (i == j || i == 2-j) {
             printf("%d\n",arr[i][j]);
        }
    }
}

字符串数组

字符串是由多个字符组合而成的一段话,C语言里没有办法直接定义字符串数据类型,不过可以用数组来定义我们所要的字符串。

一般形式

1、char 字符串名称[长度] = "字符串值";
    char name[] = "我是张三jun";
2、char 字符串名称[长度] = {'字符1','字符2',...'字符n','\0'}; //必须以'\0'结束,'\0'表示字符串的结束标志,这种方式在数组中不能写中文
    char name[] = {'w','o',' ','s','h','i',' ','A','\0'};
[]中的长度可以省略。

字符串函数

  • strlen(s) 计算字符串长度,只是计算字符串长度,不能计算其他类型数组长度
printf("%ld",strlen("sss")); //3

printf("%ld \n",strlen("语言"));//6
  • strcmp(s1,s2) 比较字符串,比较字符串的ASCII码值,返回结果:0-相等,1-s1>s2,-1-s1
char s1[] = "abc";
char s2[] = "acb";
printf("%d",strcmp(s1,s2)); //-1
printf("%d",strcmp(s2,s1)); //1
printf("%d",strcmp(s1,s1)); //0
  • strcpy(s1,s2) 字符串拷贝,拷贝后覆盖原来字符串且不能对字符串常量进行拷贝
char s1[10] = "学习 ";
char s2[] = "C语言";
strcpy(s1,s2);
printf("%s",s1);//C语言
  • strcat(s1,s2) 把字符串s2拼接到s1后,s1与s2内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串。
char s1[10] = "学习 ";
char s2[] = "C语言";

strcat(s1,s2);
printf("%s\n",s1); //学习 C语言
  • atoi(s1) 字符串转换为整数
printf("%d\n",atoi("100")); //100
printf("%d\n",atoi("aaa")); //0

猜你喜欢

转载自blog.csdn.net/fengzhixinfei/article/details/80107872