黑马程序员技术交流社区

标题: C-数组 [打印本页]

作者: wy911011    时间: 2015-7-26 22:07
标题: C-数组
数组
数组的基本概念:把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。

特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素。
数组的分类:

按存储的内容分类:数值数组、字符数组、指针数组、结构数组
按维度分类:一维数组、二位数组、三维数组

数组的定义:
格式: 类型 数组名[元素个数];
例:int arr[3]={1,2,3};

遍历数组:
For(int i=0;i<5;i++)
{
Printf(“arr[%d]=%d\n”,i,arr);
}

数组的初始化:
1)int arr[5]={17,18,19,20,21};              //一般写法
2)int arr[5]={17,18};                               //只对前两个元素赋值
3)int arr[5]={[3]=10,[4]=11};                 //对指定的元素赋值,这里为第三个和第四个
4)int arr[]={11,12,13};                           //正确,右边的元素确定,则个数可以省略这里为3个。
5)int arr[];                                               //错误,编译器无法知道应该分配多少的存储空间
6)int arr[5];arr={17,18,19,20,21};       //错误,只能在定义数组时这样进行初始化
7)int arr[‘A’]={1,2,3};                            //正确,相当于是arr[65]

计算数组元素:
当数组长度不确定时,使用sizeof
sizeof运算符可以计算出指定类型的变量所占用得字节数。

一维数组的地址:
数组名代表了数组的首地址==数组的第一个元素的地址
数组名是一个常量,存储的就是数组的首地址
每个数组元素的地址,例:
char ch[]={‘a’,’b’,’c’,’d’};
//根据下标计算这个下标的地址:ch+sizeof(char)*下标
数组的越界问题,定义的数组长度小于使用的长度,造成数组越界,会导致数据丢失。

数组元素作为函数参数:
数组用作函数参数有两种形式:
       数组元素就是下标变量,它与普通变量无区别。
1) 用数组元素作为函数参数不要求形参也必须是数组元素,但是用数组名作为函数参数时
       则要求形参和相对应的实参都必须是相同类型的数组。
2) 数组名作为函数的参数时,实参与形参之间是地址传递
3) 在变量作为函数参数是,所进行的值传递是单向的


多维数组
二维数组定义的一般形式:

类型说明符   数组名[常量表达式1][常量表达式2]

二维数组的遍历:

    int a[3][4]={1,23,4,5,67,8,9,967,23,4,55,32};
    for (int i=0; i<3; i++) {
        for (int j=0; j<4; j++) {
            printf("%d\t",a[j]);
        }
        printf("\n");
    }

二维数组的存储方式:
1)计算机会给二维数组分配一块连续的存储空间
2)数组名代表数组的首地址
3)每个元素占用相同的字节数
4)并且数组中元素之间的地址是连续的

冒泡排序
      冒泡排序的思想:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作时重复地进行指导没有再需要交换,也就是说数列已经排序完成。
        代码实现:

void maopao(int arr[],int len){

    for (int i=0; i<10; i++) {
        for (int j=0; j<len-1-i; j++) {
            if (arr[j]>arr[j+1]) {
                arr[j]=arr[j]^arr[j+1];
                arr[j+1]=arr[j]^arr[j+1];
                arr[j]=arr[j]^arr[j+1];
            }
        }
    }
}
int main(int argc, const char * argv[]) {
    int a[10]={1,3,5,6,8,22,33,45,77,198};
    int i;
    maopao(a, 10);
    for (i=0; i<9; i++) {
        printf("%d\t",a);
    }

    return 0;
}

选择排序
        选择排序思想:选择排序的基本思想是每步从待排序的记录中选出排序码最小的记录,顺序存放在已排序的记录序列的后面,直到全部排完。选择排序中主要使用直接选择排序和堆排序。
        代码实现:

void selectSort(int arr[],int len){
    int temp;
    //选择排序
    for (int i=0; i<len-1; i++) {
        for (int j=i+1; j<len; j++) {
            //调换i、j的值
            if (arr>arr[j]) {
                temp=arr;
                arr=arr[j];
                arr[j]=temp;
            }
        }
    }
}

int main(int argc, const char * argv[]){
    int a[10]={31,213,23,67,98,234,26,98,90,129};
    //调用selectSort函数
    selectSort(a, 10);
    //遍历
    for (int i=0; i<10; i++) {
        printf("%d\t",a);
    }
    return 0;
}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2