实用指南:每日一个C语言知识:C 数组

news/2025/11/13 22:57:49/文章来源:https://www.cnblogs.com/yangykaifa/p/19219823

C语言数组详解

1. 什么是数组?

数组是一种用于存储固定大小的相同类型元素的顺序集合。数组中的所有元素在内存中是连续存储的,可以通过索引(下标)来访问每个元素。

数组的主要特点


2. 数组的基本概念

C语言数组
一维数组
多维数组
字符数组
数组与指针
单个索引
线性存储
二维数组
三维数组
字符串
字符处理
数组名即指针
指针运算

3. 一维数组

数组声明和初始化
#include <stdio.h>int main() {printf("=== 一维数组基础 ===\n");// 方式1:声明后逐个初始化int numbers1[5];numbers1[0] = 10;numbers1[1] = 20;numbers1[2] = 30;numbers1[3] = 40;numbers1[4] = 50;// 方式2:声明时初始化int numbers2[5] = {1, 2, 3, 4, 5};// 方式3:自动计算数组大小int numbers3[] = {11, 22, 33, 44, 55};  // 编译器自动计算为5// 方式4:部分初始化(其余元素自动为0)int numbers4[5] = {1, 2};  // [1, 2, 0, 0, 0]// 显示数组内容printf("numbers1: ");for (int i = 0; i < 5; i++) {printf("%d ", numbers1[i]);}printf("\n");printf("numbers2: ");for (int i = 0; i < 5; i++) {printf("%d ", numbers2[i]);}printf("\n");printf("numbers3: ");for (int i = 0; i < 5; i++) {printf("%d ", numbers3[i]);}printf("\n");printf("numbers4: ");for (int i = 0; i < 5; i++) {printf("%d ", numbers4[i]);}printf("\n");return 0;}
数组的常见操作
#include <stdio.h>// 函数声明void printArray(int arr[], int size);int findMax(int arr[], int size);int findMin(int arr[], int size);int calculateSum(int arr[], int size);float calculateAverage(int arr[], int size);void reverseArray(int arr[], int size);int main() {int numbers[] = {23, 45, 12, 67, 34, 89, 56};int size = sizeof(numbers) / sizeof(numbers[0]);printf("=== 数组常见操作 ===\n");printf("原始数组: ");printArray(numbers, size);printf("数组大小: %d\n", size);printf("最大值: %d\n", findMax(numbers, size));printf("最小值: %d\n", findMin(numbers, size));printf("总和: %d\n", calculateSum(numbers, size));printf("平均值: %.2f\n", calculateAverage(numbers, size));reverseArray(numbers, size);printf("反转后数组: ");printArray(numbers, size);return 0;}// 打印数组void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");}// 查找最大值int findMax(int arr[], int size) {int max = arr[0];for (int i = 1; i < size; i++) {if (arr[i] > max) {max = arr[i];}}return max;}// 查找最小值int findMin(int arr[], int size) {int min = arr[0];for (int i = 1; i < size; i++) {if (arr[i] < min) {min = arr[i];}}return min;}// 计算总和int calculateSum(int arr[], int size) {int sum = 0;for (int i = 0; i < size; i++) {sum += arr[i];}return sum;}// 计算平均值float calculateAverage(int arr[], int size) {int sum = calculateSum(arr, size);return (float)sum / size;}// 反转数组void reverseArray(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;}}
数组排序算法
#include <stdio.h>// 函数声明void bubbleSort(int arr[], int size);void selectionSort(int arr[], int size);void printArray(int arr[], int size);int main() {int numbers1[] = {64, 34, 25, 12, 22, 11, 90};int numbers2[] = {64, 34, 25, 12, 22, 11, 90};int size = sizeof(numbers1) / sizeof(numbers1[0]);printf("=== 数组排序算法 ===\n");printf("原始数组: ");printArray(numbers1, size);// 冒泡排序bubbleSort(numbers1, size);printf("冒泡排序后: ");printArray(numbers1, size);// 选择排序selectionSort(numbers2, size);printf("选择排序后: ");printArray(numbers2, size);return 0;}// 冒泡排序void bubbleSort(int arr[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; 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 size) {for (int i = 0; i < size - 1; i++) {int minIndex = i;for (int j = i + 1; j < size; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}// 交换元素int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");}

4. 多维数组

二维数组
#include <stdio.h>#define ROWS 3#define COLS 4// 函数声明void print2DArray(int arr[ROWS][COLS]);int findMax2D(int arr[ROWS][COLS]);int calculateSum2D(int arr[ROWS][COLS]);void transposeMatrix(int arr[ROWS][COLS], int result[COLS][ROWS]);int main() {// 二维数组的声明和初始化int matrix1[ROWS][COLS] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};// 另一种初始化方式int matrix2[ROWS][COLS] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};// 部分初始化int matrix3[ROWS][COLS] = {{1, 2},        // 第一行:1, 2, 0, 0{5, 6, 7},     // 第二行:5, 6, 7, 0{9}            // 第三行:9, 0, 0, 0};printf("=== 二维数组示例 ===\n");printf("matrix1:\n");print2DArray(matrix1);printf("matrix2:\n");print2DArray(matrix2);printf("matrix3:\n");print2DArray(matrix3);printf("二维数组最大值: %d\n", findMax2D(matrix1));printf("二维数组总和: %d\n", calculateSum2D(matrix1));// 矩阵转置int transposed[COLS][ROWS];transposeMatrix(matrix1, transposed);printf("转置矩阵:\n");for (int i = 0; i < COLS; i++) {for (int j = 0; j < ROWS; j++) {printf("%d ", transposed[i][j]);}printf("\n");}return 0;}// 打印二维数组void print2DArray(int arr[ROWS][COLS]) {for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {printf("%d\t", arr[i][j]);}printf("\n");}}// 查找二维数组最大值int findMax2D(int arr[ROWS][COLS]) {int max = arr[0][0];for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {if (arr[i][j] > max) {max = arr[i][j];}}}return max;}// 计算二维数组总和int calculateSum2D(int arr[ROWS][COLS]) {int sum = 0;for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {sum += arr[i][j];}}return sum;}// 矩阵转置void transposeMatrix(int arr[ROWS][COLS], int result[COLS][ROWS]) {for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {result[j][i] = arr[i][j];}}}
二维数组的实际应用:学生成绩系统
#include <stdio.h>#define STUDENTS 5#define SUBJECTS 3// 科目名称const char* subjectNames[] = {"数学", "英语", "编程"};// 函数声明void inputGrades(int grades[STUDENTS][SUBJECTS]);void printGradeTable(int grades[STUDENTS][SUBJECTS]);void calculateStudentAverages(int grades[STUDENTS][SUBJECTS], float averages[]);void calculateSubjectAverages(int grades[STUDENTS][SUBJECTS], float averages[]);void findTopStudent(int grades[STUDENTS][SUBJECTS]);int main() {int grades[STUDENTS][SUBJECTS];float studentAverages[STUDENTS];float subjectAverages[SUBJECTS];printf("=== 学生成绩管理系统 ===\n");// 输入成绩inputGrades(grades);// 显示成绩表printf("\n=== 成绩表 ===\n");printGradeTable(grades);// 计算学生平均分calculateStudentAverages(grades, studentAverages);printf("\n=== 学生平均分 ===\n");for (int i = 0; i < STUDENTS; i++) {printf("学生%d: %.2f\n", i + 1, studentAverages[i]);}// 计算科目平均分calculateSubjectAverages(grades, subjectAverages);printf("\n=== 科目平均分 ===\n");for (int i = 0; i < SUBJECTS; i++) {printf("%s: %.2f\n", subjectNames[i], subjectAverages[i]);}// 查找优秀学生findTopStudent(grades);return 0;}// 输入成绩void inputGrades(int grades[STUDENTS][SUBJECTS]) {printf("请输入%d个学生的%d门科目成绩:\n", STUDENTS, SUBJECTS);for (int i = 0; i < STUDENTS; i++) {printf("学生%d:\n", i + 1);for (int j = 0; j < SUBJECTS; j++) {printf("  %s成绩: ", subjectNames[j]);scanf("%d", &grades[i][j]);}}}// 打印成绩表void printGradeTable(int grades[STUDENTS][SUBJECTS]) {// 打印表头printf("学生\\科目\t");for (int j = 0; j < SUBJECTS; j++) {printf("%s\t", subjectNames[j]);}printf("\n");// 打印分隔线printf("--------\t");for (int j = 0; j < SUBJECTS; j++) {printf("----\t");}printf("\n");// 打印成绩for (int i = 0; i < STUDENTS; i++) {printf("学生%d\t\t", i + 1);for (int j = 0; j < SUBJECTS; j++) {printf("%d\t", grades[i][j]);}printf("\n");}}// 计算学生平均分void calculateStudentAverages(int grades[STUDENTS][SUBJECTS], float averages[]) {for (int i = 0; i < STUDENTS; i++) {int sum = 0;for (int j = 0; j < SUBJECTS; j++) {sum += grades[i][j];}averages[i] = (float)sum / SUBJECTS;}}// 计算科目平均分void calculateSubjectAverages(int grades[STUDENTS][SUBJECTS], float averages[]) {for (int j = 0; j < SUBJECTS; j++) {int sum = 0;for (int i = 0; i < STUDENTS; i++) {sum += grades[i][j];}averages[j] = (float)sum / STUDENTS;}}// 查找优秀学生void findTopStudent(int grades[STUDENTS][SUBJECTS]) {int topStudent = 0;int maxTotal = 0;for (int i = 0; i < STUDENTS; i++) {int total = 0;for (int j = 0; j < SUBJECTS; j++) {total += grades[i][j];}if (total > maxTotal) {maxTotal = total;topStudent = i;}}printf("\n=== 优秀学生 ===\n");printf("学生%d (总分: %d)\n", topStudent + 1, maxTotal);printf("各科成绩: ");for (int j = 0; j < SUBJECTS; j++) {printf("%s:%d ", subjectNames[j], grades[topStudent][j]);}printf("\n");}
三维数组
#include <stdio.h>#define X 2#define Y 3#define Z 4int main() {// 三维数组声明和初始化int cube[X][Y][Z] = {{   // 第一个二维平面{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}},{   // 第二个二维平面{13, 14, 15, 16},{17, 18, 19, 20},{21, 22, 23, 24}}};printf("=== 三维数组示例 ===\n");// 访问三维数组元素printf("cube[0][1][2] = %d\n", cube[0][1][2]);  // 7printf("cube[1][2][3] = %d\n", cube[1][2][3]);  // 24// 遍历三维数组printf("\n三维数组内容:\n");for (int i = 0; i < X; i++) {printf("平面 %d:\n", i);for (int j = 0; j < Y; j++) {for (int k = 0; k < Z; k++) {printf("%d\t", cube[i][j][k]);}printf("\n");}printf("\n");}// 计算三维数组元素总和int total = 0;for (int i = 0; i < X; i++) {for (int j = 0; j < Y; j++) {for (int k = 0; k < Z; k++) {total += cube[i][j][k];}}}printf("三维数组元素总和: %d\n", total);return 0;}

5. 字符数组和字符串

字符数组基础
#include <stdio.h>#include <string.h>int main() {printf("=== 字符数组和字符串 ===\n");// 方式1:字符数组(不是字符串,因为没有null终止符)char arr1[] = {'H', 'e', 'l', 'l', 'o'};// 方式2:字符串(以null字符'\0'结尾)char arr2[] = "Hello";// 方式3:指定大小的字符数组char arr3[10] = "Hello";// 方式4:逐个初始化char arr4[6];arr4[0] = 'H';arr4[1] = 'e';arr4[2] = 'l';arr4[3] = 'l';arr4[4] = 'o';arr4[5] = '\0';  // 重要:添加null终止符printf("arr1 (字符数组): ");for (int i = 0; i < 5; i++) {printf("%c", arr1[i]);}printf("\n");printf("arr2 (字符串): %s\n", arr2);printf("arr3: %s\n", arr3);printf("arr4: %s\n", arr4);// 字符串长度printf("arr2长度: %lu\n", strlen(arr2));printf("arr2数组大小: %lu\n", sizeof(arr2));  // 包括'\0'return 0;}
字符串操作函数
#include <stdio.h>#include <string.h>int main() {char str1[50] = "Hello";char str2[50] = "World";char str3[100];char str4[50];printf("=== 字符串操作函数 ===\n");// 字符串长度printf("str1长度: %lu\n", strlen(str1));// 字符串复制strcpy(str3, str1);printf("复制后str3: %s\n", str3);// 字符串连接strcat(str3, " ");strcat(str3, str2);printf("连接后str3: %s\n", str3);// 字符串比较printf("str1和str2比较: %d\n", strcmp(str1, str2));printf("str1和\"Hello\"比较: %d\n", strcmp(str1, "Hello"));// 字符串查找char *found = strchr(str3, 'W');if (found != NULL) {printf("在str3中找到'W': %s\n", found);}// 子字符串查找found = strstr(str3, "World");if (found != NULL) {printf("在str3中找到\"World\": %s\n", found);}// 字符串分割char text[] = "apple,banana,cherry,date";char *token = strtok(text, ",");printf("分割字符串:\n");while (token != NULL) {printf("- %s\n", token);token = strtok(NULL, ",");}return 0;}
自定义字符串函数
#include <stdio.h>// 自定义字符串函数int myStrlen(const char *str);void myStrcpy(char *dest, const char *src);void myStrcat(char *dest, const char *src);int myStrcmp(const char *str1, const char *str2);int main() {char str1[50] = "Hello";char str2[50] = "World";char result[100];printf("=== 自定义字符串函数 ===\n");printf("myStrlen(\"%s\") = %d\n", str1, myStrlen(str1));myStrcpy(result, str1);printf("myStrcpy: %s\n", result);myStrcat(result, " ");myStrcat(result, str2);printf("myStrcat: %s\n", result);printf("myStrcmp(\"%s\", \"%s\") = %d\n", str1, str2, myStrcmp(str1, str2));printf("myStrcmp(\"%s\", \"%s\") = %d\n", str1, "Hello", myStrcmp(str1, "Hello"));return 0;}// 自定义字符串长度函数int myStrlen(const char *str) {int length = 0;while (str[length] != '\0') {length++;}return length;}// 自定义字符串复制函数void myStrcpy(char *dest, const char *src) {int i = 0;while (src[i] != '\0') {dest[i] = src[i];i++;}dest[i] = '\0';  // 添加null终止符}// 自定义字符串连接函数void myStrcat(char *dest, const char *src) {// 找到dest的结尾int dest_len = myStrlen(dest);int i = 0;// 将src复制到dest的结尾while (src[i] != '\0') {dest[dest_len + i] = src[i];i++;}dest[dest_len + i] = '\0';  // 添加null终止符}// 自定义字符串比较函数int myStrcmp(const char *str1, const char *str2) {int i = 0;while (str1[i] != '\0' && str2[i] != '\0') {if (str1[i] != str2[i]) {return str1[i] - str2[i];}i++;}return str1[i] - str2[i];}

6. 数组与指针的关系

数组名即指针
#include <stdio.h>int main() {int numbers[] = {10, 20, 30, 40, 50};int size = sizeof(numbers) / sizeof(numbers[0]);printf("=== 数组与指针的关系 ===\n");printf("数组名numbers: %p\n", numbers);printf("&numbers[0]: %p\n", &numbers[0]);printf("数组名等于第一个元素的地址: %s\n",numbers == &numbers[0] ? "是" : "否");// 通过指针访问数组元素printf("\n通过指针访问数组:\n");int *ptr = numbers;  // ptr指向数组的第一个元素for (int i = 0; i < size; i++) {printf("numbers[%d] = %d, *(ptr + %d) = %d\n",i, numbers[i], i, *(ptr + i));}// 指针运算printf("\n指针运算:\n");printf("*ptr = %d\n", *ptr);        // 第一个元素printf("*(ptr + 1) = %d\n", *(ptr + 1));  // 第二个元素printf("*(ptr + 2) = %d\n", *(ptr + 2));  // 第三个元素// 修改数组元素通过指针*(ptr + 1) = 99;printf("\n修改后numbers[1] = %d\n", numbers[1]);return 0;}
数组作为函数参数
#include <stdio.h>// 函数声明void processArray(int *arr, int size);void modifyArray(int arr[], int size);int main() {int numbers[] = {1, 2, 3, 4, 5};int size = sizeof(numbers) / sizeof(numbers[0]);printf("=== 数组作为函数参数 ===\n");printf("原始数组: ");for (int i = 0; i < size; i++) {printf("%d ", numbers[i]);}printf("\n");// 数组作为指针传递processArray(numbers, size);printf("processArray调用后: ");for (int i = 0; i < size; i++) {printf("%d ", numbers[i]);}printf("\n");// 数组作为数组传递modifyArray(numbers, size);printf("modifyArray调用后: ");for (int i = 0; i < size; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;}// 使用指针语法void processArray(int *arr, int size) {for (int i = 0; i < size; i++) {arr[i] *= 2;  // 修改数组元素}}// 使用数组语法(实际上还是指针)void modifyArray(int arr[], int size) {for (int i = 0; i < size; i++) {arr[i] += 10;  // 修改数组元素}}

7. 动态数组(使用指针和malloc)

#include <stdio.h>#include <stdlib.h>// 函数声明int* createDynamicArray(int size);void inputDynamicArray(int *arr, int size);void printDynamicArray(int *arr, int size);void freeDynamicArray(int *arr);int main() {int size;int *dynamicArray;printf("=== 动态数组示例 ===\n");printf("请输入数组大小: ");scanf("%d", &size);if (size <= 0) {printf("错误:数组大小必须为正数!\n");return 1;}// 创建动态数组dynamicArray = createDynamicArray(size);if (dynamicArray == NULL) {printf("错误:内存分配失败!\n");return 1;}// 输入数组元素printf("请输入%d个整数:\n", size);inputDynamicArray(dynamicArray, size);// 显示数组元素printf("动态数组内容: ");printDynamicArray(dynamicArray, size);// 计算总和和平均值int sum = 0;for (int i = 0; i < size; i++) {sum += dynamicArray[i];}printf("总和: %d\n", sum);printf("平均值: %.2f\n", (float)sum / size);// 释放内存freeDynamicArray(dynamicArray);return 0;}// 创建动态数组int* createDynamicArray(int size) {int *arr = (int*)malloc(size * sizeof(int));return arr;}// 输入动态数组void inputDynamicArray(int *arr, int size) {for (int i = 0; i < size; i++) {printf("元素 %d: ", i + 1);scanf("%d", &arr[i]);}}// 打印动态数组void printDynamicArray(int *arr, int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");}// 释放动态数组内存void freeDynamicArray(int *arr) {free(arr);printf("动态数组内存已释放\n");}

8. 实际应用示例

示例1:投票统计系统
#include <stdio.h>#define CANDIDATES 5#define MAX_VOTERS 100// 候选人名称const char* candidateNames[] = {"张三", "李四", "王五", "赵六", "钱七"};int main() {int votes[CANDIDATES] = {0};  // 初始化所有候选人的票数为0int voterCount = 0;int choice;printf("=== 投票统计系统 ===\n");printf("候选人列表:\n");for (int i = 0; i < CANDIDATES; i++) {printf("%d. %s\n", i + 1, candidateNames[i]);}printf("0. 结束投票\n");// 收集投票while (voterCount < MAX_VOTERS) {printf("\n选民 %d, 请选择候选人 (1-%d, 0结束): ",voterCount + 1, CANDIDATES);scanf("%d", &choice);if (choice == 0) {break;  // 结束投票}if (choice < 1 || choice > CANDIDATES) {printf("无效选择!请选择1-%d之间的数字。\n", CANDIDATES);continue;}// 记录投票votes[choice - 1]++;voterCount++;printf("感谢您的投票!\n");}// 显示投票结果printf("\n=== 投票结果 ===\n");printf("总投票数: %d\n", voterCount);int maxVotes = 0;int winner = -1;for (int i = 0; i < CANDIDATES; i++) {printf("%s: %d票 (%.1f%%)\n",candidateNames[i], votes[i],(float)votes[i] / voterCount * 100);if (votes[i] > maxVotes) {maxVotes = votes[i];winner = i;}}// 检查是否有并列第一int tieCount = 0;for (int i = 0; i < CANDIDATES; i++) {if (votes[i] == maxVotes) {tieCount++;}}if (tieCount > 1) {printf("\n并列第一的候选人:\n");for (int i = 0; i < CANDIDATES; i++) {if (votes[i] == maxVotes) {printf("- %s\n", candidateNames[i]);}}} else {printf("\n获胜者: %s (%d票)\n", candidateNames[winner], maxVotes);}return 0;}
示例2:矩阵运算
#include <stdio.h>#define ROWS 2#define COLS 3// 函数声明void printMatrix(int matrix[ROWS][COLS], const char* name);void addMatrices(int A[ROWS][COLS], int B[ROWS][COLS], int result[ROWS][COLS]);void multiplyByScalar(int matrix[ROWS][COLS], int scalar, int result[ROWS][COLS]);int findMatrixMax(int matrix[ROWS][COLS]);int findMatrixMin(int matrix[ROWS][COLS]);int main() {int matrixA[ROWS][COLS] = {{1, 2, 3},{4, 5, 6}};int matrixB[ROWS][COLS] = {{6, 5, 4},{3, 2, 1}};int result[ROWS][COLS];printf("=== 矩阵运算 ===\n");// 显示原始矩阵printMatrix(matrixA, "矩阵A");printMatrix(matrixB, "矩阵B");// 矩阵加法addMatrices(matrixA, matrixB, result);printMatrix(result, "A + B");// 标量乘法multiplyByScalar(matrixA, 2, result);printMatrix(result, "2 × A");// 查找最大值和最小值printf("矩阵A的最大值: %d\n", findMatrixMax(matrixA));printf("矩阵A的最小值: %d\n", findMatrixMin(matrixA));printf("矩阵B的最大值: %d\n", findMatrixMax(matrixB));printf("矩阵B的最小值: %d\n", findMatrixMin(matrixB));return 0;}// 打印矩阵void printMatrix(int matrix[ROWS][COLS], const char* name) {printf("%s:\n", name);for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {printf("%d\t", matrix[i][j]);}printf("\n");}printf("\n");}// 矩阵加法void addMatrices(int A[ROWS][COLS], int B[ROWS][COLS], int result[ROWS][COLS]) {for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {result[i][j] = A[i][j] + B[i][j];}}}// 标量乘法void multiplyByScalar(int matrix[ROWS][COLS], int scalar, int result[ROWS][COLS]) {for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {result[i][j] = matrix[i][j] * scalar;}}}// 查找矩阵最大值int findMatrixMax(int matrix[ROWS][COLS]) {int max = matrix[0][0];for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {if (matrix[i][j] > max) {max = matrix[i][j];}}}return max;}// 查找矩阵最小值int findMatrixMin(int matrix[ROWS][COLS]) {int min = matrix[0][0];for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {if (matrix[i][j] < min) {min = matrix[i][j];}}}return min;}

9. 数组的常见错误

#include <stdio.h>int main() {printf("=== 数组常见错误 ===\n");int numbers[5] = {1, 2, 3, 4, 5};// ❌ 错误1:数组越界访问/*printf("numbers[5] = %d\n", numbers[5]);  // 越界访问printf("numbers[-1] = %d\n", numbers[-1]); // 越界访问*/// ✅ 正确:使用有效索引printf("有效访问: numbers[0] = %d, numbers[4] = %d\n",numbers[0], numbers[4]);// ❌ 错误2:数组整体赋值/*int arr1[3] = {1, 2, 3};int arr2[3];arr2 = arr1;  // 错误:不能直接赋值数组*/// ✅ 正确:逐个元素复制int arr1[3] = {1, 2, 3};int arr2[3];for (int i = 0; i < 3; i++) {arr2[i] = arr1[i];}printf("数组复制成功\n");// ❌ 错误3:数组大小使用变量(C89标准)/*int size = 5;int arr[size];  // 在C89中错误,C99支持变长数组*/// ✅ 正确:使用常量或宏定义大小#define SIZE 5int arr[SIZE];printf("使用常量定义数组大小\n");// ❌ 错误4:字符串未正确终止/*char str[5] = {'H', 'e', 'l', 'l', 'o'};  // 不是字符串,缺少'\0'printf("%s\n", str);  // 可能导致未定义行为*/// ✅ 正确:确保字符串以'\0'结尾char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};printf("正确字符串: %s\n", str);return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/964796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 对话框 - 对话框全屏显示(设置 Window 属性、采用自定义样式、继承 DialogFragment 达成、继承 Dialog 建立)

Android 对话框 - 对话框全屏显示(设置 Window 属性、采用自定义样式、继承 DialogFragment 达成、继承 Dialog 建立)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importa…

2025年陕西短视频制作服务商TOP5实力榜:AI赋能内容创作新时代

随着短视频成为企业品牌传播和流量获取的核心阵地,市场对专业制作服务商的需求持续攀升。本榜单基于技术创新力、行业服务经验、客户满意度及AI应用能力四大维度,结合本地企业服务案例数据,全面解析2025年陕西地区五…

面试官问:什么是Java内存模型? - 教程

面试官问:什么是Java内存模型? - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

Spring AI Alibaba 项目源码学习(四)-Graph中的存储分析

Store 存储系统分析 请关注微信公众号:阿呆-bot 概述 本文档分析 spring-ai-alibaba-graph-core 模块中的 Store 存储系统,包括接口设计、实现模式、支持的存储类型和关键设计点。 入口类说明 Store - 存储接口 Stor…

20251113 正睿

A给定 \(n, m, k\),需要构造一个数组 \(a\),使得 \(a_i\) 为 \([1, m]\) 的整数且 \(\sum \gcd(i, i + 1) = k\) \(n \le 10^5, m \le 10^{12}, n - 1 \le k \le (n - 2)m\),可以证明有解。对于这种类型的构造题,结…

好消息,.NET 10 正式发布,更智能、更安全、更高性能的统一开发平台!

前言 好消息,.NET 团队于 2025 11 月 11 日宣布 .NET 10 正式发布,这是迄今为止最高效、最现代、最安全、最智能且性能最高的 .NET 版本。长期支持版本(LTS) .NET 10 是一个长期支持版本(LTS) ,将支持三年 ,直…

从Dalvik字节码角度优化安卓编码

目录静态属性与this指针字段与局部变量final属性与编译优化内部类与桥接方法匿名类与Lambda小结 安卓开发中,Java/Kotlin等高级语言被编译成.class字节码,之后通过dx/d8、r8等工具编译成dex文件(Dalvik字节码),打…

基于Java+SSM+Flask家庭理财系统(源码+LW+调试文档+讲解等)/家庭理财/理财系统/家庭财务/家庭财务规划/家庭账目/家庭财务软件/家庭记账/理财器具/财务多元化/资产管理。

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

.NET Conf China 2025:讲师与主题全揭秘

.NET Conf China 2025:讲师与主题全揭秘备受期待的第七届.NET中国峰会——.NET Conf China 2025,即将于11月30日在上海盛大举行。本次大会聚焦性能跃升、AI融合、跨平台开发三大核心方向,邀请了来自国内外知名科技企…

深入解析:洞穴人的仰望:洞穴人隐喻与进步主义的歧途

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《JIRA:项目管理与敏捷开发实践》

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。 find_if(begin, end, predicate):查找…

20232319 2025-2026-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 任务1:DNS域名信息查询 任务2:获取好友IP地址及地理地址 任务3:使用nmap扫描靶机 任务4:使用Nessus扫描靶机 任务5:网络足迹与Google hacking 2.实验过程 2.1 DNS域名信息查询 2.1.1 查询baidu.com的I…

主动交互和情境感知,AI 硬件是脱离手机屏幕掌控的蓝海机会丨硬件和端侧模型专场@RTE2025 回顾

在本届 RTE2025 大会上,来自产业界和学术界的多位专家深入探讨了 AI 硬件、端侧小模型的发展趋势、架构创新、低功耗解决方案以及语音技术与大模型的深度融合。Rokid 全球创新产品、工程和开放生态负责人赵维奇、Folo…

WSL移植小记

前言给团队小家伙培训到 openmp 部分时顺带给他们配置了 wsl。wsl默认安装在 C 盘,随着 wsl 上安装的工具增多其占用空间也会越来越大,挤占 C 盘空间。为了避免以后 C 盘爆掉的问题,因此写了一个 wsl 迁移笔记供其使…

2025年西北数字人厂商最新TOP5评测:引领陕西甘肃智区域能交互新生态

2025年西北数字人服务厂商TOP5评测:引领智能交互新生态随着虚拟数字人技术在文旅、教育、电商等领域的深度应用,市场对专业化服务厂商的需求持续攀升。本榜单基于技术研发实力、区域服务能力、行业适配广度三大核心维…

centos 环境下部署mongodb并设定密码

1、下载mongodb文件,下载地址为:https://www.mongodb.com/try/download/community 2、下载截图3、创建安装目录mkdir -p /home/software/mongodb4、解压mongo安装文件(此处以截图5.0.9.tgz为例)至 /home/software/…

20232317 2025-2026-1 《网络与系统攻防技术》实验四实验报告

1、实验内容 1.1恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada…

谷歌起诉网络犯罪团伙Smishing Triad,揭露大规模钓鱼攻击

谷歌正式起诉总部位于中国的网络犯罪团伙Smishing Triad,该团伙使用"Lighthouse"钓鱼即服务工具包实施大规模短信钓鱼攻击,窃取受害者财务信息,影响全球120个国家数百万信用卡持卡人。谷歌起诉网络犯罪团…

PLC与单片机区

PLC与单片机区 PLC是模块化解决问题,不需要额外认证https://gitee.com/powes/,作者:前沿风暴,转载请注明原文链接:https://www.cnblogs.com/Kreos/p/19219748

2025.11.13总结

对心理咨询的新提出的需求进行分析拆解流程 1. 用户注册与孩子信息管理功能流程:用户完成APP基础注册后,系统强制跳转至“孩子信息管理”页面。 核心逻辑:强制填写:用户必须至少填写一位孩子的完整信息(字段完全遵…