【问题标题】:Pointer to pointer Array指向指针数组的指针
【发布时间】:2016-07-30 22:10:42
【问题描述】:

我正在尝试制作一个“int** arr[5]”,其中的每个单元格都包含一个“int* 数组”,每个“int* 数组”都有不同的大小。每当我尝试打印其中一个单元格时,它只会打印其中的第一个数字,为​​什么会这样?如何打印整个数组?

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

void sortNumber(int** arr[]);


int main(void)
{
    int i = 0;

    int* arr1[3] = { 2, 5, 8 };
    int* arr2[2] = { 1, 7 };
    int* arr3[6] = { 5, 1, 8, 3, 7 ,12 };
    int* arr4[4] = { 3, 9, 4, 29};
    int* arr5[5] = { 4, 11, 17, 23, 25 };

    int** bigArr[5] = {*arr1, *arr2, *arr3, *arr4, *arr5};

    sortNumber(bigArr);


    system("PAUSE");
    return 0;
}

void sortNumber(int** arr[])
{
    printf("%d", arr[1]);
}

【问题讨论】:

  • 因为您只打印一个元素。需要一个循环。
  • 您的代码有几个问题。请阅读“指针”。
  • *arr1int * 类型,用于初始化bigArr 的其他表达式也是如此。如果您改用&amp;arr1[0](键入“指向int 指针或int ** 的指针),那就没问题了。除此之外,OldProgrammer 是正确的,因为您需要一个循环。但是,这里有一个与循环思路:你怎么知道传递给sortNumber 的数组在哪里结束?没有itemCount 参数,bigArr 不会以任何类型的sentinel value 结束,例如NULL 指针。
  • 您必须在将 int 表声明为表或指针(int arr[] 或 int *arr)之间进行选择;重新检查并仔细分析您的代码。
  • +1 @ChronoKitsune 的观察结果。要打印出所有数组元素,您需要知道有多少。 C 没有你在许多其他语言中找到的 array.length 属性的奢侈。因此,您需要明确定义 itemCount或使用哨兵值,但在处理整数时可能会变得混乱)。您可能需要考虑使用类似这样的东西:struct iArray_s{ int *arr; int itemCount; } 这将创建一个结构,您可以在其中存储整数数组以及一个可以指定数组包含多少成员的变量。

标签: c pointer-to-pointer pointer-to-array


【解决方案1】:

所以您正在使用二维数组。您需要以 arr[i][j] 格式打印它。

for(int i = 0; i < THREE; i++)
   printf("%d", arr[THREE][i]);

【讨论】:

    【解决方案2】:

    这里有几个问题。我并不完全清楚你的目标是什么,但看起来你想处理一个二维数组,其中二维有不同的长度条目。

    int* arr1[3] = { 2, 5, 8 };
    

    在那里你创建了一个包含指针的数组。您正在用数字初始化元素,但这些是指针——条目指向由数字表示的内存地址。 IE。第一个元素指向内存地址 2——真的是这样吗?如果你想存储数字,你需要在这里使用一个简单的数组。

    int** bigArr[5] = {*arr1, *arr2, *arr3, *arr4, *arr5};
    

    在这里您将arr1 的值等分配给bigArr 的元素。但是,由于您取消引用 arr1,因此您不会获得指向该数组的指针。相反,您会得到第一个元素的值(*arr1arr1[0] 基本相同)。所以现在bigArr 存储int** 值,它们只是子数组的第一个元素。不存储指向子数组的指针。您可以通过指针或数组访问来访问数组元素,这基本上就是这里出了问题。

    一般来说指针:以下两行行为相同:

    int a = arr1[1];
    int b = *(arr1 + 1);
    

    您还可以通过两种不同的方式获取指向数组的指针。最后两个指针都指向数组的第一个元素:

    int array[] = {1, 2, 3};
    int *ptr1 = array;
    int *ptr2 = &array[0];
    

    最后,C 不存储数组的长度——你需要知道这一点。

    我假设您要存储这样的数据结构:

    [
     [ 2, 5, 8 ],
     [ 1, 7 ],
     [ 5, 1, 8, 3, 7, 12 ],
     [ 3, 9, 4, 29 ],
     [ 4, 11, 17, 23, 25 ]
    ]
    

    为此,您不需要双指针。此外,您需要存储子数组的长度。一种方法是使用结构数组。

    struct row {
        int* data;
        int length;
    };
    
    int arr1[3] = { 2, 5, 8 };
    int arr2[2] = { 1, 7 };
    // ...
    
    struct row r1 = {arr1, 3};
    struct row r2 = {arr2, 2};
    // ...
    struct row *bigArr[] = {r1, r2, ...};
    

    现在sortNumber 更改为

    void sortNumber(struct row* r)
    {
        for(int i = 0; i < r->length; i++) {
            printf("%i ", r->data[i]);
        }
        printf("\n");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多