一维数组

线性数据结构

一维数组是最基本的数组形式,用于存储线性序列数据。东巴文(db-w.cn) 将带你深入理解一维数组,掌握其核心应用。

💡 东巴文观点:一维数组是相同类型数据的线性集合,通过下标访问元素,是C语言数据组织的基础。

一维数组概述

什么是一维数组?

东巴文说明:一维数组是一组相同类型数据的有序集合,存储在连续的内存空间中,通过单个下标访问元素。

东巴文一维数组特点

一维数组特点
├── 元素类型相同
├── 内存连续
├── 单下标访问
├── 长度固定
└── 线性结构

一维数组的声明与初始化

声明方式

#include <stdio.h>

int main() {
    printf("=== 东巴文一维数组声明 ===\n\n");
    
    // 声明数组
    int arr1[5];  // 声明但不初始化
    double arr2[10];  // 声明double数组
    char arr3[20];  // 声明char数组
    
    // 声明并初始化
    int arr4[5] = {1, 2, 3, 4, 5};
    
    // 部分初始化
    int arr5[5] = {1, 2};  // 其余元素为0
    
    // 自动推断长度
    int arr6[] = {1, 2, 3, 4, 5};
    
    // 全部初始化为0
    int arr7[5] = {0};
    
    printf("arr4: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr4[i]);
    }
    printf("\n");
    
    return 0;
}

初始化规则

#include <stdio.h>

int main() {
    printf("=== 东巴文一维数组初始化规则 ===\n\n");
    
    // 规则1:完全初始化
    int arr1[5] = {1, 2, 3, 4, 5};
    printf("完全初始化:");
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr1[i]);
    }
    printf("\n");
    
    // 规则2:部分初始化
    int arr2[5] = {1, 2};
    printf("部分初始化:");
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr2[i]);
    }
    printf("\n");
    
    // 规则3:省略大小
    int arr3[] = {1, 2, 3, 4, 5};
    printf("省略大小:");
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr3[i]);
    }
    printf("\n");
    
    // 规则4:初始化为0
    int arr4[5] = {0};
    printf("初始化为0:");
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr4[i]);
    }
    printf("\n");
    
    return 0;
}

一维数组的访问

下标访问

#include <stdio.h>

int main() {
    printf("=== 东巴文一维数组下标访问 ===\n\n");
    
    int arr[5] = {10, 20, 30, 40, 50};
    
    // 通过下标访问
    printf("arr[0] = %d\n", arr[0]);
    printf("arr[2] = %d\n", arr[2]);
    printf("arr[4] = %d\n", arr[4]);
    
    // 修改元素
    arr[1] = 25;
    printf("修改后 arr[1] = %d\n", arr[1]);
    
    // 遍历数组
    printf("\n遍历数组:\n");
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
    
    return 0;
}

内存布局

#include <stdio.h>

int main() {
    printf("=== 东巴文一维数组内存布局 ===\n\n");
    
    int arr[5] = {10, 20, 30, 40, 50};
    
    printf("数组元素地址:\n");
    for (int i = 0; i < 5; i++) {
        printf("&arr[%d] = %p, 值 = %d\n", i, &arr[i], arr[i]);
    }
    
    printf("\n数组首地址:%p\n", arr);
    printf("数组大小:%zu 字节\n", sizeof(arr));
    printf("元素大小:%zu 字节\n", sizeof(arr[0]));
    printf("元素个数:%zu\n", sizeof(arr) / sizeof(arr[0]));
    
    return 0;
}

东巴文说明

  • 数组元素在内存中连续存储
  • 数组名是数组首元素的地址
  • 数组下标从0开始
  • 相邻元素地址差值为元素大小

一维数组的操作

输入输出

#include <stdio.h>

int main() {
    printf("=== 东巴文一维数组输入输出 ===\n\n");
    
    int arr[5];
    
    // 输入数组元素
    printf("请输入5个整数:\n");
    for (int i = 0; i < 5; i++) {
        scanf("%d", &arr[i]);
    }
    
    // 输出数组元素
    printf("\n数组元素:\n");
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
    
    return 0;
}

求和与平均值

#include <stdio.h>

int main() {
    printf("=== 东巴文一维数组求和与平均值 ===\n\n");
    
    int scores[] = {85, 92, 78, 90, 88};
    int count = sizeof(scores) / sizeof(scores[0]);
    
    int sum = 0;
    for (int i = 0; i < count; i++) {
        sum += scores[i];
    }
    
    double average = (double)sum / count;
    
    printf("分数:");
    for (int i = 0; i < count; i++) {
        printf("%d ", scores[i]);
    }
    printf("\n");
    
    printf("总分:%d\n", sum);
    printf("平均分:%.2f\n", average);
    
    return 0;
}

查找最值

#include <stdio.h>

int main() {
    printf("=== 东巴文一维数组查找最值 ===\n\n");
    
    int arr[] = {23, 45, 12, 67, 34, 89, 56};
    int count = sizeof(arr) / sizeof(arr[0]);
    
    int max = arr[0];
    int min = arr[0];
    int maxIndex = 0;
    int minIndex = 0;
    
    for (int i = 1; i < count; i++) {
        if (arr[i] > max) {
            max = arr[i];
            maxIndex = i;
        }
        if (arr[i] < min) {
            min = arr[i];
            minIndex = i;
        }
    }
    
    printf("数组:");
    for (int i = 0; i < count; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    printf("最大值:arr[%d] = %d\n", maxIndex, max);
    printf("最小值:arr[%d] = %d\n", minIndex, min);
    
    return 0;
}

查找元素

#include <stdio.h>

// 线性查找
int linearSearch(int arr[], int size, int target) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == target) {
            return i;
        }
    }
    return -1;
}

// 二分查找(要求数组已排序)
int binarySearch(int arr[], int size, int target) {
    int left = 0, right = size - 1;
    
    while (left <= right) {
        int mid = left + (right - left) / 2;
        
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    
    return -1;
}

int main() {
    printf("=== 东巴文一维数组查找 ===\n\n");
    
    int arr[] = {10, 20, 30, 40, 50};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    // 线性查找
    int target = 30;
    int index = linearSearch(arr, size, target);
    if (index != -1) {
        printf("线性查找:%d 在位置 %d\n", target, index);
    } else {
        printf("未找到 %d\n", target);
    }
    
    // 二分查找
    target = 40;
    index = binarySearch(arr, size, target);
    if (index != -1) {
        printf("二分查找:%d 在位置 %d\n", target, index);
    } else {
        printf("未找到 %d\n", target);
    }
    
    return 0;
}

数组排序

#include <stdio.h>

// 冒泡排序
void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// 选择排序
void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

int main() {
    printf("=== 东巴文一维数组排序 ===\n\n");
    
    int arr1[] = {64, 34, 25, 12, 22, 11, 90};
    int arr2[] = {64, 34, 25, 12, 22, 11, 90};
    int count = sizeof(arr1) / sizeof(arr1[0]);
    
    printf("排序前:");
    for (int i = 0; i < count; i++) {
        printf("%d ", arr1[i]);
    }
    printf("\n");
    
    bubbleSort(arr1, count);
    printf("冒泡排序后:");
    for (int i = 0; i < count; i++) {
        printf("%d ", arr1[i]);
    }
    printf("\n");
    
    selectionSort(arr2, count);
    printf("选择排序后:");
    for (int i = 0; i < count; i++) {
        printf("%d ", arr2[i]);
    }
    printf("\n");
    
    return 0;
}

数组反转

#include <stdio.h>

void reverse(int arr[], int size) {
    for (int i = 0; i < size / 2; i++) {
        int temp = arr[i];
        arr[i] = arr[size - 1 - i];
        arr[size - 1 - i] = temp;
    }
}

int main() {
    printf("=== 东巴文一维数组反转 ===\n\n");
    
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    printf("反转前:");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    reverse(arr, size);
    
    printf("反转后:");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}

数组复制

#include <stdio.h>

int main() {
    printf("=== 东巴文一维数组复制 ===\n\n");
    
    int source[] = {1, 2, 3, 4, 5};
    int dest[5];
    int size = sizeof(source) / sizeof(source[0]);
    
    // 复制数组
    for (int i = 0; i < size; i++) {
        dest[i] = source[i];
    }
    
    printf("原数组:");
    for (int i = 0; i < size; i++) {
        printf("%d ", source[i]);
    }
    printf("\n");
    
    printf("目标数组:");
    for (int i = 0; i < size; i++) {
        printf("%d ", dest[i]);
    }
    printf("\n");
    
    return 0;
}

一维数组与函数

数组作为函数参数

#include <stdio.h>

// 数组作为参数
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 修改数组元素
void doubleArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        arr[i] *= 2;
    }
}

// 计算数组元素和
int sumArray(int arr[], int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return sum;
}

int main() {
    printf("=== 东巴文一维数组与函数 ===\n\n");
    
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    printf("原数组:");
    printArray(arr, size);
    
    doubleArray(arr, size);
    printf("翻倍后:");
    printArray(arr, size);
    
    int sum = sumArray(arr, size);
    printf("数组元素和:%d\n", sum);
    
    return 0;
}

东巴文说明

  • 数组作为函数参数时,传递的是数组首地址
  • 函数内修改数组会影响原数组
  • 需要额外传递数组大小

一维数组的应用实例

统计分析

#include <stdio.h>
#include <math.h>

int main() {
    printf("=== 东巴文一维数组统计分析 ===\n\n");
    
    double data[] = {85.5, 92.0, 78.5, 90.0, 88.5};
    int count = sizeof(data) / sizeof(data[0]);
    
    // 计算总和
    double sum = 0;
    for (int i = 0; i < count; i++) {
        sum += data[i];
    }
    
    // 计算平均值
    double mean = sum / count;
    
    // 计算方差和标准差
    double variance = 0;
    for (int i = 0; i < count; i++) {
        variance += pow(data[i] - mean, 2);
    }
    variance /= count;
    double stdDev = sqrt(variance);
    
    printf("数据:");
    for (int i = 0; i < count; i++) {
        printf("%.1f ", data[i]);
    }
    printf("\n");
    
    printf("总和:%.2f\n", sum);
    printf("平均值:%.2f\n", mean);
    printf("方差:%.2f\n", variance);
    printf("标准差:%.2f\n", stdDev);
    
    return 0;
}

去重

#include <stdio.h>

int removeDuplicates(int arr[], int size) {
    if (size == 0) return 0;
    
    int uniqueCount = 1;
    for (int i = 1; i < size; i++) {
        int j;
        for (j = 0; j < uniqueCount; j++) {
            if (arr[i] == arr[j]) {
                break;
            }
        }
        if (j == uniqueCount) {
            arr[uniqueCount] = arr[i];
            uniqueCount++;
        }
    }
    
    return uniqueCount;
}

int main() {
    printf("=== 东巴文一维数组去重 ===\n\n");
    
    int arr[] = {1, 2, 3, 2, 4, 3, 5, 1, 6};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    printf("原数组:");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    int uniqueCount = removeDuplicates(arr, size);
    
    printf("去重后:");
    for (int i = 0; i < uniqueCount; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}

东巴文最佳实践

1. 数组越界检查

#include <stdio.h>

int main() {
    printf("=== 东巴文数组越界检查 ===\n\n");
    
    int arr[5] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    // ✅ 正确:检查边界
    int index = 3;
    if (index >= 0 && index < size) {
        printf("arr[%d] = %d\n", index, arr[index]);
    } else {
        printf("索引越界\n");
    }
    
    return 0;
}

2. 使用sizeof计算数组长度

#include <stdio.h>

int main() {
    printf("=== 东巴文计算数组长度 ===\n\n");
    
    int arr[] = {1, 2, 3, 4, 5};
    
    // ✅ 正确:使用sizeof
    int size = sizeof(arr) / sizeof(arr[0]);
    printf("数组长度:%d\n", size);
    
    return 0;
}

3. 初始化数组

#include <stdio.h>

int main() {
    printf("=== 东巴文数组初始化 ===\n\n");
    
    // ✅ 推荐:初始化为0
    int arr1[5] = {0};
    
    // ✅ 推荐:完全初始化
    int arr2[5] = {1, 2, 3, 4, 5};
    
    printf("arr1: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr1[i]);
    }
    printf("\n");
    
    return 0;
}

东巴文验证清单

完成本章学习后,请确认:

  • 理解一维数组的概念
  • 掌握一维数组的声明与初始化
  • 掌握一维数组的访问
  • 掌握一维数组的操作
  • 掌握一维数组与函数
  • 掌握一维数组的应用
  • 掌握最佳实践

下一步学习

掌握一维数组后,你可以继续学习:

如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!


东巴文(db-w.cn) - 让编程学习更简单

📦 东巴文一维数组提示:一维数组是C语言数据组织的基础,掌握一维数组是学习高级数据结构的关键。在 db-w.cn,我们会通过大量实例帮你掌握一维数组的使用!