C 语言基础五: 数组

13 阅读2分钟

C 语言基础五: 数组

1.初始化数组

int arr1[4] = {1,2,3,4};
int arr2[] = {1,2,3,4};

2.访问数组中某个元素

 printf("first:%d\n",arr2[0]);

3. 获取数组长度

 printf("length:%lu\n",sizeof(arr1)/sizeof(arr1[0]));

4. 数组默认值

    int a[5] = {10}; //默认值0
    float b[3] = {0.2}; //默认值0.0
    char c[3] = {"j"}; //默认值 "\0"什么也没有
    //字符串数组
    char *d[4] = {"apple"};  //默认值null

5. 当成参数传递

  • 错误示范
#include <stdio.h>

void printfArr(int arr[]);

int main(void){
 
    int arr[] = {1,2,3,4,5};
    printfArr(arr);
    return 0;
 
}

/*
 数组当参数传递,他会被隐式准换位指向数组某个元素的指针
 */

void printfArr(int arr[]){
    int len = sizeof(arr)/sizeof(int);
    for (int i = 0; i < len; i++) {
        printf("i:%d\n",arr[i]);  //只会输出1和2
        
    }
}
  • 正确使用方法
#include <stdio.h>

void printfArr(int arr[],int len);

int main(void){
 
    int arr[] = {1,2,3,4,5};
    int len = sizeof(arr)/sizeof(int);
    printfArr(arr,len);
    for (int i = 0; i < len; i++) {
        printf("j:%d\n",arr[i]);  //只会输出1和2
    }
    return 0;
}

/*
 数组当参数传递,他会被隐式准换位指向数组某个元素的指针
 函数收到的是指针的值,而非数组内容
 函数内部修改,会影响到原数组
 */

void printfArr(int arr[],int len){
    
    for (int i = 0; i < len; i++) {
        printf("i:%d\n",arr[i]);  //只会输出1和2
        arr[i] = arr[i] * 2;
        
    }
}

6. 二维数组

(1) 创建规则二维数组及遍历
 //定义二维数组方式1
    int arr[3][5] =
    {
        {1,2,3,4,5},
        {11,22,33,44,55},
        {111,222,333,444,555},
    };
    
    //遍历数组
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 5; j++) {
            printf("%d  ",arr[i][j]);
        }
        printf("\n");
    }
(2) 不规则二维数组 - 注意点
//定义二维数组方式2:
    int arr1[3] = {1,2,3};
    int arr2[4] = {4,5,6,7};
    int arr3[5] = {8,9,10,11,12};
    
    int* arrx[3] = {arr1,arr2,arr3};
    
    
    for (int i = 0; i < 3; i++) {
        // arr1:使用数组名计算的时候,退化为第一个元素的指针,此时不代表数组那个整体了
        // 指针 --- 内存地址,8个字节,所以下边的len都为2
        int len = sizeof(arrx[i])/ sizeof(int);
        printf("len: %d \n",len);
        for (int j = 0; j < len; j++) {
            printf("%d  ",arrx[i][j]);
        }
        printf("\n");
    }
    
    //打印结果
    // 1 2
    // 4 5
    // 8 9

(3) 指针遍历二维数组

 //定义二维数组方式2:
    int arr1[3] = {1,2,3};
    int arr2[4] = {4,5,6,7};
    int arr3[5] = {8,9,10,11,12};
    
    int len1 = sizeof(arr1)/sizeof(int);
    int len2 = sizeof(arr2)/sizeof(int);
    int len3 = sizeof(arr3)/sizeof(int);
    
    int lenArr[] = {len1,len2,len3};
    int* arrx[3] = {arr1,arr2,arr3};
    
    //普通方式
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < lenArr[i]; j++) {
            printf("%d  ",arrx[i][j]);
        }
        printf("\n");
    }
    
    //指针遍历数组
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < lenArr[i]; j++) {
            printf("%d  ",*(*(arrx + i) + j));
        }
        printf("\n");
    }