MST

星途 面试题库

面试题:C语言数组指针与指针数组的区别及应用

请详细阐述C语言中数组指针和指针数组的区别,并编写代码示例说明它们的不同用法。假设有需求:有一个二维数组,其每一行存储不同长度的字符串,如何使用数组指针或指针数组实现对这些字符串的高效管理和访问,并说明选择的理由。
12.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

数组指针和指针数组的区别

  1. 定义

    • 数组指针:是一个指针,它指向一个数组。即该指针存储的是整个数组的首地址。其定义形式为 类型 (*指针变量名)[数组长度],例如 int (*p)[10];,这里 p 是一个指向含有10个 int 类型元素的数组的指针。
    • 指针数组:是一个数组,数组中的每个元素都是指针。其定义形式为 类型 *数组名[数组长度],例如 int *p[10];,这里 p 是一个数组,数组中有10个 int 型指针。
  2. 内存布局

    • 数组指针:只占用一个指针的内存空间(通常在32位系统是4字节,64位系统是8字节),它指向一块连续的数组内存区域。
    • 指针数组:占用的内存空间是数组元素个数乘以指针类型的大小。例如,对于 int *p[10];,若指针占4字节(32位系统),则该数组占用40字节,数组中的每个指针可以指向不同的内存区域。
  3. 运算

    • 数组指针:对数组指针进行 +1 操作,指针移动的距离是整个数组的大小。例如,对于 int (*p)[10];p + 1 移动的字节数为 10 * sizeof(int)
    • 指针数组:对指针数组的元素(指针)进行 +1 操作,移动的距离是其所指向类型的大小。例如,对于 int *p[10];p[0]+1 移动的字节数为 sizeof(int)

代码示例

#include <stdio.h>

// 数组指针示例
void arrayPointerExample() {
    int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
    int (*p)[4] = arr; // 定义数组指针,指向一个含有4个int元素的数组

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", *(*(p + i)+j));
        }
        printf("\n");
    }
}

// 指针数组示例
void pointerArrayExample() {
    int a = 10, b = 20, c = 30;
    int *p[3] = {&a, &b, &c}; // 定义指针数组

    for (int i = 0; i < 3; i++) {
        printf("%d ", *p[i]);
    }
    printf("\n");
}

管理不同长度字符串的二维数组

对于每一行存储不同长度字符串的二维数组,使用指针数组更合适。理由如下:

  1. 灵活性:指针数组中的每个指针可以指向不同长度的字符串,更符合需求。而数组指针指向的数组长度是固定的,难以满足不同长度字符串的存储。
  2. 内存使用效率:指针数组可以为每个字符串分配恰好所需的内存,避免了数组指针可能造成的内存浪费(如果使用数组指针,可能需要按最长字符串的长度来定义数组,会浪费大量内存)。

代码示例:

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

void manageStrings() {
    char *strings[3];
    strings[0] = "hello";
    strings[1] = "world";
    strings[2] = "c programming";

    for (int i = 0; i < 3; i++) {
        printf("%s\n", strings[i]);
    }
}

在上述代码中,strings 是一个指针数组,每个元素指向一个不同长度的字符串。通过这种方式,可以高效地管理和访问不同长度的字符串。