MST

星途 面试题库

面试题:C语言指针与数组的关系

请阐述C语言中指针与数组的联系与区别,并举例说明如何通过指针访问数组元素以及如何用数组表示法访问指针指向的内存区域。
29.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

联系

  1. 在C语言中,数组名在大多数表达式中会被自动转换为指向数组首元素的指针。例如,int arr[5];,在很多情况下arr就相当于&arr[0],是一个指针常量。
  2. 可以使用指针算术运算来访问数组元素,也可以使用数组下标法访问指针指向的内存区域,这两种方式在很多场景下是等效的。

区别

  1. 本质不同:数组是一块连续的内存区域,用于存储多个相同类型的数据,其大小在编译时就确定。而指针是一个变量,存储的是一个内存地址。
  2. 内存分配方式:数组的内存是静态分配(在栈上或全局数据区,取决于定义位置),而指针所指向的内存可以是动态分配(如使用malloc等函数)。
  3. 可修改性:数组名作为指针常量,其值不能被修改。例如int arr[5]; arr++;是错误的。而普通指针变量的值可以修改,指向不同的内存地址。

通过指针访问数组元素

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr; // 让指针指向数组首元素

    // 通过指针访问数组元素
    for (int i = 0; i < 5; i++) {
        printf("%d ", *(ptr + i));
    }
    return 0;
}

用数组表示法访问指针指向的内存区域

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(5 * sizeof(int));
    if (ptr == NULL) {
        return 1;
    }

    for (int i = 0; i < 5; i++) {
        ptr[i] = i + 1; // 用数组表示法给指针指向的内存区域赋值
    }

    for (int i = 0; i < 5; i++) {
        printf("%d ", ptr[i]); // 用数组表示法访问指针指向的内存区域
    }

    free(ptr);
    return 0;
}