gpt4 book ai didi

c++ - 通过函数传递指向数组数组的指针

转载 作者:搜寻专家 更新时间:2023-10-30 23:50:59 24 4
gpt4 key购买 nike

有一个指向数组数组的指针,即代码中的 NameList。我希望将 Pointer(NameList) 中每个数组的内容一一打印出来。下面的代码无法完成任务。请。帮助。

int Data1[] = {10,10};
int Data2[] = {20,20};
int Data3[] = {30,30};

int *NameList[] = {Data1, Data2, Data3};
main()
{ Function(NameList); }

Function(int *ArrayPointer)
{
int i, j, index=0;
for (i=0; i < 3; i++)
{
for (j=0; j < 2; j++)
{
//It does not print the data
printf("\nName: %s", ArrayPointer[index++]);
}
index=0; //Counter reset to 0
ArrayPointer++; //Pointer is incremented by one to pick next array in the pointer
}
}
print("code sample");

问题的原始发布者的另一条注释:

我已经在 Turbo C 中完成了一个吃 bean 人游戏。我正在完善一些图形例程,以便可以轻松地再次使用它。这只是为帮助和理解概念而创建的一个小示例。代码中的所有数据实际上都是 Sprite 的字符数组。现在我只想调用一个传递指针的函数,以便将指针中的每个数组绘制到屏幕上。如何修改此代码以处理此问题?我实际上被困在这里。

最佳答案

该死的 litb,你又一次以几分钟的优势领先我。 (要是我的 child 没有经常醒来就好了……)

啊,这到底是怎么回事。也许这对某些人仍然有用。


哦,只是为了确定这件事:

  • 数组,例如 int a[4] 为其数据分配内存空间。
  • 指针,例如 int * p 只为指向内存中另一个位置的指针分配足够的内存空间。
  • 这就是为什么我们可以在数组上使用 sizeof 并获得完整的内存占用,但不能在指针上使用。

除此之外,int[] 和 int* 之间确实没有太大区别。 (想想有多少人声明 *main(int argc, char **argv) vs main(int argc, char * argv[])。)


注意:这里所有的内存地址都是虚构的。我编造它们只是为了说明一个观点。

给定:

int Data1[] = {10,11};
int Data2[] = {20,22};
int Data3[] = {30,33};

我们现在有 3 个内存块。说:

0xffff0000-0xffff0003  with a value of (int)(10)
0xffff0004-0xffff0007 with a value of (int)(11)

0xffff0008-0xffff000b with a value of (int)(20)
0xffff000c-0xffff000f with a value of (int)(22)

0xffff0010-0xffff0013 with a value of (int)(30)
0xffff0014-0xffff0017 with a value of (int)(33)

地点:

Data1 == & Data1 [0] == 0xffff0000
Data2 == & Data2 [0] == 0xffff0008
Data3 == & Data3 [0] == 0xffff0010

,我会在这里讨论大端字节序和小端字节序!

是的,在这种情况下,Data1[2] == Data2[0]。但是您不能依赖您的编译器按照我在此处布置它们的方式将它们布置在内存中。

下一步:

int *NameList[] = {Data1, Data2, Data3};

所以我们现在有了另一 block 内存。说:

0xffff0018-0xffff001b  with a value of (int*)(0xffff0000)
0xffff001c-0xffff001f with a value of (int*)(0xffff0008)
0xffff0020-0xffff0023 with a value of (int*)(0xffff0010)

地点:

NameList == & NameList [0] == 0xffff0018

注意NameList是int **类型,不是int*类型!

然后我们可以写:

void Function(int **ArrayPointer)
{
for ( int i=0; i < 3; i++ )
for ( int j=0; j < 2; j++)
printf("Name: %d\n", ArrayPointer[i][j] );
}

int main() { Function(NameList); }

ArrayPointer 解析为 (int**)0xffff0018。

ArrayPointer[0] == *( (int**) 0xffff0018 ) == (int*)(0xffff0000) == Data1。

ArrayPointer[0][1] == *( ( * (int**) 0xffff0018 ) + 1 ) == (int) * ( (int*)0xffff0000 + 1 ) == (int) * (int* ) 0xffff0004 == 数据 1[1]。


你可能想回顾一下指针算法:array[N] == *( array + N )

关于c++ - 通过函数传递指向数组数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/406010/

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