在 C 语言中,求数组的长度(即数组中元素的个数)通常使用以下两种方法:

1. 🌟 使用 sizeof 运算符(推荐)

这是最常用且最可靠的方法。sizeof 运算符可以计算出变量或类型所占的字节数。

💡 示例代码:

#include <stdio.h>

int main() {
    // 定义一个整型数组
    int myArray[] = {10, 20, 30, 40, 50};

    // 1. 计算整个数组占用的总字节数
    size_t total_size = sizeof(myArray); // size_t 是 sizeof 运算符返回的无符号整数类型

    // 2. 计算单个元素占用的字节数
    size_t element_size = sizeof(myArray[0]);

    // 3. 计算数组长度 (元素个数)
    size_t array_length = total_size / element_size;

    printf("数组的总字节数是: %zu 字节\n", total_size);
    printf("单个元素 (int) 的字节数是: %zu 字节\n", element_size);
    printf("数组的长度 (元素个数) 是: %zu\n", array_length);

    // 更简洁的写法
    size_t length_short = sizeof(myArray) / sizeof(myArray[0]);
    printf("简洁计算的数组长度是: %zu\n", length_short);

    return 0;
}

2. 📝 针对字符数组(字符串)

对于以空字符 \0 结尾的字符数组(C 风格字符串),你可以使用 <string.h> 头文件中的 strlen() 函数来获取字符串的实际长度(不包括 \0)。

💡 示例代码:

#include <stdio.h>
#include <string.h> // 使用 strlen() 需要包含此头文件

int main() {
    char myString[] = "Hello"; // 实际占用 6 个字节 ('H', 'e', 'l', 'l', 'o', '\0')

    // 1. 使用 sizeof 计算数组的声明大小 (包括 '\0')
    size_t array_size = sizeof(myString);
    printf("sizeof(myString) 数组声明大小 (含\\0) 是: %zu\n", array_size);

    // 2. 使用 strlen 计算字符串的实际长度 (不含 '\0')
    size_t string_length = strlen(myString);
    printf("strlen(myString) 字符串实际长度 (不含\\0) 是: %zu\n", string_length);

    return 0;
}

⚠️ 重要限制 (指针陷阱)

注意: 上述 sizeof 方法只能在定义数组的同一函数作用域内使用。

如果你将数组作为参数传递给一个函数,它会退化成一个指针(指向数组第一个元素的地址)。在这种情况下,sizeof 运算符将返回指针的字节大小(通常是 4 或 8 字节),而不是整个数组的大小。

❌ 错误示例 (演示指针陷阱):

#include <stdio.h>

void print_length(int arr[]) {
    // ⚠️ 陷阱:在这里 arr 实际上是一个 int* 类型的指针,而不是整个数组。
    // 所以 sizeof(arr) 返回的是指针的大小(例如 8 字节),而不是数组的总大小。
    size_t pointer_size = sizeof(arr);
    printf("在函数内部,sizeof(arr) 返回的是指针大小: %zu 字节\n", pointer_size);

    // 因此,这种计算方法是错误的:
    // size_t length = sizeof(arr) / sizeof(arr[0]);
}

int main() {
    int data[] = {1, 2, 3, 4, 5, 6, 7, 8};
    printf("在 main 函数内,数组的正确长度是: %zu\n", sizeof(data) / sizeof(data[0]));

    print_length(data); // 传递数组
    return 0;
}

解决方法:

如果需要跨函数使用数组长度,必须将数组长度作为一个单独的参数传递给函数。

#include <stdio.h>

// 将数组和它的长度作为两个参数传入
void process_array(int arr[], size_t length) {
    printf("在函数内部,接收到的数组长度是: %zu\n", length);
    // 可以在函数内部安全地使用 length 进行循环等操作
}

int main() {
    int data[] = {10, 20, 30, 40};
    size_t array_len = sizeof(data) / sizeof(data[0]);

    process_array(data, array_len); // 传递数组和它的长度

    return 0;
}

总结来说,在 C 语言中计算数组长度的标准方法是:

$$\frac{\text{sizeof}(\text{数组名})}{\text{sizeof}(\text{数组名}[0])}$$

您想让我为您演示一个使用数组长度进行循环的完整示例吗?