c - 你如何在 C 中创建一个指针数组?

标签 c arrays pointers

如何创建一个指针数组,其中每个元素都包含一个指向其他值的指针

例如如果我有

int** arr[5] = {0xbfjeabfbfe,0x...}; //is it the right way to do it?

void 数组类型意味着什么?像 void **newArray[5];

假设我想使用 malloc 或 calloc 为指针数组动态分配内存!!语法是什么?

最佳答案

How do you create an array of pointers in C?

要在 C 中创建一个指针数组,您有一个选择,您声明:

  type *array[CONST];  /* create CONST number of pointers to type */

使用 C99+,您可以创建指针的可变长度数组 (VLA),例如

  type *array[var];   /* create var number of pointers to type */

标准在 C11 Standard - 6.7.6.2 Array declarators 中定义了两者并在 C11 Standard - 6.5.2.1 Array subscripting 中讨论订阅.

一个使用指针数组的简短示例,将指向二维数组中每一行的指针分配给指向 int 的指针数组,例如

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

#define COL 3
#define MAX 5

int main (void) {

    int arr2d[MAX][COL] = {{ 0 }},  /* simple 2D array */
        *arr[MAX] = { NULL },       /* 5 pointers to int */
        i, j, v = 0;

    for (i = 0; i < MAX; i++) {     /* fill 2D array */
        for (j = 0; j < COL; j++)
            arr2d[i][j] = v++;
        arr[i] = arr2d[i];          /* assing row-pointer to arr */
    }

    for (i = 0; i < MAX; i++) {     /* for each pointer */
        for (j = 0; j < COL; j++)   /* output COL ints */
            printf (" %4d", arr[i][j]);
        putchar ('\n');
    }
}

示例使用/输出

$ ./bin/array_ptr2int_vla
    0    1    2
    3    4    5
    6    7    8
    9   10   11
   12   13   14

C 的另一个基础是指针到指针,但它不是“数组”,尽管它通常被称为“动态数组”并且可以模拟数组进行分配和索引. “数组”和指针集合之间的区别在于,对于数组,所有值都保证在内存中是连续的——指针集合及其引用的内存位置没有这样的保证。

int **arr[CONST] 声明了什么?

在您的问题中,您声明了 int** arr[5] = {0xbfjeabfbfe,0x...};,那么它声明了什么?你正在宣布某事的五,但是什么?您声明了五个 pointer-to-pointer-to-int。你能做到吗?当然。

那么您如何处理指向某物的指针?指向指针的指针构成了动态分配和重新分配的类型集合的支柱。它们通常被称为“动态分配的数组”,但这有点用词不当,因为不能保证所有值在内存中都是顺序。您将声明给定数量的指向数组中每个 int** 的指针。您不必分配相同数量的指针。

(注意:不能保证指针指向的内存是连续的,尽管指针本身是连续的——确保你理解这种区别以及什么是“数组”保证和指针不保证的内容)

int** arr[5] 声明了五个 int**。然后,您可以自由地为五个指针中的每一个分配您喜欢的任何地址,只要类型是 int** 即可。例如,您将使用类似于以下内容的指针来分配:

  arr[i] = calloc (ROW, sizeof *arr[i]);  /* allocates ROW number of pointers */

然后您可以自由分配任意数量的 int 并将该地址分配给每个指针,例如

  arr[i][j] = calloc (COL, sizeof *arr[i][j]); /* allocates COL ints */

然后你可以遍历整数赋值:

  arr[i][j][k] = v++;

一个使用 int** arr[5] 类型分配的简短示例可能类似于:

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

#define ROW 3
#define COL ROW
#define MAX 5

int main (void) {

    int **arr[MAX] = { NULL },  /* 5 pointer-to-pointer-to-int */
        i, j, k, v = 0;

    for (i = 0; i < MAX; i++) { /* allocate ROW pointers to each */
        if ((arr[i] = calloc (ROW, sizeof *arr[i])) == NULL) {
            perror ("calloc - pointers");
            return 1;
        }
        for (j = 0; j < ROW; j++) { /* allocate COL ints each pointer */
            if ((arr[i][j] = calloc (COL, sizeof *arr[i][j])) == NULL) {
                perror ("calloc - integers");
                return 1;
            }
            for (k = 0; k < COL; k++)   /* assign values to ints */
                arr[i][j][k] = v++;
        }
    }

    for (i = 0; i < MAX; i++) { /* output each pointer-to-pointer to int */
        printf ("pointer-to-pointer-to-int: %d\n\n", i);
        for (j = 0; j < ROW; j++) {     /* for each allocated pointer */
            for (k = 0; k < COL; k++)   /* output COL ints */
                printf ("  %4d", arr[i][j][k]);
            free (arr[i][j]);   /* free the ints */
            putchar ('\n');
        }
        free (arr[i]);      /* free the pointer */
        putchar ('\n');
    }

    return 0;
}

您已经分配了五个模拟二维数组,将指向每个数组的指针分配给您的 int **arr[5] 数组,输出将是:

示例使用/输出

$ ./bin/array_ptr2ptr2int
pointer-to-pointer-to-int: 0

     0     1     2
     3     4     5
     6     7     8

pointer-to-pointer-to-int: 1

     9    10    11
    12    13    14
    15    16    17

pointer-to-pointer-to-int: 2

    18    19    20
    21    22    23
    24    25    26

pointer-to-pointer-to-int: 3

    27    28    29
    30    31    32
    33    34    35

pointer-to-pointer-to-int: 4

    36    37    38
    39    40    41
    42    43    44

希望这有助于区分指针数组和指向指针的指针数组,并展示了如何声明和使用它们。如果您有任何其他问题,请随时提出。

关于c - 你如何在 C 中创建一个指针数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50011963/

相关文章:

c - 为什么这个 pointer-fu 会发生段错误?

c - strcat 上的段错误

C:避免频繁类型转换的高性能临时变量

c - post和pre递减c函数putchar中的char指针值的区别

c - 关于动态分配内存给 char 指针的简单问题

c - 我很困惑如何理解此代码。包含双指针

c - 为什么应该使用 strncpy 而不是 strcpy?

arrays - 如何在 swift 中按键对字典数组进行分组?

php - php 中的 Javascript 数组格式错误

javascript - 将 PHP 数组转换为项目对象以与 AngularJS 一起使用