gpt4 book ai didi

c - 指向 C 中二维数组的指针

转载 作者:太空狗 更新时间:2023-10-29 16:23:44 25 4
gpt4 key购买 nike

我知道有几个关于提供好的(和有效的)解决方案的问题,但恕我直言,没有一个明确说明什么是实现这一目标的最佳方法。所以,假设我们有一些二维数组:

int tab1[100][280];

我们想创建一个指向这个二维数组的指针。为此,我们可以这样做:

int (*pointer)[280]; // pointer creation
pointer = tab1; //assignation
pointer[5][12] = 517; // use
int myint = pointer[5][12]; // use

或者,或者:

int (*pointer)[100][280]; // pointer creation
pointer = &tab1; //assignation
(*pointer)[5][12] = 517; // use
int myint = (*pointer)[5][12]; // use

好的,两者似乎都运作良好。现在我想知道:

  • 最好的方法是什么,第一种还是第二种?
  • 对于编译器来说两者都相等吗? (速度、性能……)
  • 这些解决方案中的一种是否比另一种占用更多内存?
  • 开发人员更常使用什么?

最佳答案

//defines an array of 280 pointers (1120 or 2240 bytes)
int *pointer1 [280];

//defines a pointer (4 or 8 bytes depending on 32/64 bits platform)
int (*pointer2)[280]; //pointer to an array of 280 integers
int (*pointer3)[100][280]; //pointer to an 2D array of 100*280 integers

使用 pointer2pointer3 生成与 ++pointer2 相同的二进制文件,正如 WhozCraig 指出的那样.

我推荐使用typedef(生成与上面pointer3相同的二进制代码)

typedef int myType[100][280];
myType *pointer3;

注意:从 C++11 开始,您还可以使用关键字 using 而不是 typedef

using myType = int[100][280];
myType *pointer3;

在你的例子中:

myType *pointer;                // pointer creation
pointer = &tab1; // assignation
(*pointer)[5][12] = 517; // set (write)
int myint = (*pointer)[5][12]; // get (read)

注意:如果在函数体内使用数组tab1 => 这个数组将被放置在调用堆栈内存中。但是堆栈大小是有限的。使用大于可用内存堆栈的数组会产生 stack overflow crash .

完整代码段可在 gcc.godbolt.org 在线编译

int main()
{
//defines an array of 280 pointers (1120 or 2240 bytes)
int *pointer1 [280];
static_assert( sizeof(pointer1) == 2240, "" );

//defines a pointer (4 or 8 bytes depending on 32/64 bits platform)
int (*pointer2)[280]; //pointer to an array of 280 integers
int (*pointer3)[100][280]; //pointer to an 2D array of 100*280 integers
static_assert( sizeof(pointer2) == 8, "" );
static_assert( sizeof(pointer3) == 8, "" );

// Use 'typedef' (or 'using' if you use a modern C++ compiler)
typedef int myType[100][280];
//using myType = int[100][280];

int tab1[100][280];

myType *pointer; // pointer creation
pointer = &tab1; // assignation
(*pointer)[5][12] = 517; // set (write)
int myint = (*pointer)[5][12]; // get (read)

return myint;
}

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

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