gpt4 book ai didi

c++ - 指定指向二维数组的指针

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:43 24 4
gpt4 key购买 nike

如果我声明一个二维数组

int A[sz][sz];

如何创建指向该对象的指针?

我问是因为我想通过指向指针 int** 的指针从函数返回数组,但我想在事先不知道大小的情况下构建数组。大小将作为参数传递。我想知道是否有一种方法可以在不使用动态分配的情况下执行此操作。

问题是,如果我在函数内执行类似 int** A 的操作,这不会为 A 提供有关我想要的大小的信息。

如果它是二维数组,我如何创建数组然后将指针分配给该数组。

我应该更清楚。我想返回一个指向指针的指针,这样它就不是指向二维数组的指针,而是类似于 int** 的指针。

最佳答案

你的问题是,int** 形式的二维数组需要一个 int* 数组来进行两步解引用,当你用 int A[sz][sz]; 声明一个数组。

你可以像这样自己构建它:

int* pointers[sz];
for(size_t i = sz; i--; ) pointers[i] = A[i];

这可能看起来很荒谬,但它 Root 于 C 处理数组的方式:A[i]int ()[sz] 类型,它是子数组i 行。但是,当您在赋值中使用该数组时,它衰减 指向指向该子数组中第一个元素的指针,该元素的类型为 int*。循环之后,Apointers是两个截然不同的东西(A的类型是int()[sz][sz ])

旁注:你说你想从一个函数中返回 this。如果您的数组分配在堆栈上,您不得返回指向其数据的指针,它会在您的函数返回时消失。您只能返回指向具有 static 存储或属于另一个现有对象一部分的对象的指针/引用。如果您不遵守这一点,您可能会出现堆栈损坏。

编辑:

关于 C 的一个鲜为人知的事实是,您实际上可以将指针传递给真正的 C 数组,而不仅仅是数组衰减到的指针类型。这是一个小程序来演示这一点:

#include <stddef.h>
#include <stdio.h>

int (*foo(int size, int (*bar)[size][size], int y))[] {
return &(*bar)[y];
}

int main() {
int mySize = 30;
int baz[mySize][mySize];
int (*result)[mySize];
result = foo(mySize, &baz, 15);
printf("%ld\n", (size_t)result - (size_t)baz);
}

这个示例程序的预期输出是 1800。重要的是数组的实际大小必须是已知的,或者作为编译时常量,或者通过与数组指针一起传递(如果它被传递与数组指针一起,大小参数必须出现在数组指针出现之前)。

关于c++ - 指定指向二维数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18860419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com