当前位置:  开发笔记 > 编程语言 > 正文

通过函数将指针传递给数组

如何解决《通过函数将指针传递给数组》经验,为你挑选了1个好方法。

在代码中有一个指向数组的指针,即NameList.我希望逐个打印指针(NameList)中每个数组的内容.以下代码无法执行任务.PLS.救命.

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中完成了一个pacman游戏.我正在抛光一些图形例程,以便它可以轻松地重复使用.这只是为了帮助和理解这个概念而创建的一个小样本.代码中的所有数据实际上都是sprite的char数组.现在我只想调用一个传递指针的函数,以便指针中的每个数组都被绘制到屏幕上.如何修改此代码来处理此问题?我实际上是在这里.



1> Mr.Ree..:

点燃它,再一次,你只需几分钟就能击败我.(如果我没有孩子继续醒来......)

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


哦,只是为了解决这个问题:

诸如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

,我不会在这里进入big-endian vs little-endian字节排序!

是的,在这种情况下,Data1 [2] == Data2 [0].但你不能依赖你的编译器在内存中放置内容,就像我在这里放置它们一样.

下一个:

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

所以我们现在有另一块内存.说:

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 = = Data1 [1].


您可能想要查看指针算术:array [N] ==*(array + N)

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有