Passing Pointer To An Array Of Arrays Through Function

前端 未结 6 1808
南旧
南旧 2021-01-21 14:00

There is a pointer-to-an-Array of Arrays i.e. NameList in the code. I want the contents of each of the Arrays in the Pointer(NameList) to get printed one by one. The below co

6条回答
  •  没有蜡笔的小新
    2021-01-21 14:36

    Darn it litb, once again you beat me to the punch by mere minutes. (If only I didn't have kids who keep waking up...)

    Ahh, what the hell. Perhaps this will still be useful to somebody.


    Oh, and just to nail this thing down:

    • Arrays, such as int a[4] allocate memory space for their data.
    • Pointers, such as int * p allocate just enouch memory space for a pointer to another spot in memory.
    • That's why we can use sizeof on arrays and get the full memory footprint, but not on pointers.

    Other than that little distinction, there really isn't a big difference between int[] and int*. (Consider how many folks declare *main(int argc, char **argv) vs main(int argc, char * argv[]).)


    ATTENTION: All memory addresses here are fictional. I'm just making them up to illustrate a point.

    Given:

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

    We now have 3 blocks of memory. Say:

    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)
    

    Where:

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

    NO, I'm not going to get into big-endian vs little-endian byte ordering here!

    Yes, in this case, Data1[2] == Data2[0]. But you can't rely on your compiler laying things out in memory the same way I've laid them out here.

    Next:

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

    So we now have another block of memory. Say:

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

    Where:

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

    Note that NameList is of int ** type, and NOT int* type!

    We can then write:

    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 resolves to (int**)0xffff0018.

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

    ArrayPointer[0][1] == *( ( * (int**) 0xffff0018 ) + 1 ) == (int) * ( (int*)0xffff0000 + 1 ) == (int) * (int*) 0xffff0004 == Data1[1].


    You may want to review pointer arithmetic: array[N] == *( array + N )

提交回复
热议问题