Passing Pointer To An Array Of Arrays Through Function

前端 未结 6 1769
南旧
南旧 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:20

    main has to return a type. You forget to put "int" as a return type (implicit int in C++ is banned).

    Having said that, i'm not sure what you mean by

    // It does not print the data
    printf("\nName: %s",  ArrayPointer[index++]);
    

    ArrayPointer[index++] would, as it is defined in the parameter list, return an int. How is that supposed to store a name ? It will store an integer!

    Once again, that said, you can't call that Function (pun intended) with that particular argument. Let's view your types:

    int Data1[] = {10,10};
    int Data2[] = {20,20};
    int Data3[] = {30,30};
    
    int *NameList[] = {Data1, Data2, Data3};
    
    Data1      Data2      Data3      NameList
    int[2]     int[2]     int[2]     int*[3]
    

    Contrary to what you said, NameList is not a pointer to an array of arrays. I feel i need to show you what that would be:

    int (*NameList)[N][M] = Some3DimensionalArray;
    

    That wouldn't make sense at all. So what do you have?

    Data1 = array of 2 int
    Data2 = array of 2 int
    Data3 = array of 2 int
    NameList = array of poiners to int
    

    That is what you got. And you pass NameList to a Function that wants a pointer to an int. It must fail already at the time you call Function in main! I've got no idea what you mean by name in that line in Function. But if you want to print out the integers that are stored in the arrays pointed to (by pointers to their first element), you can do it like this (keeping your code as much as i can):

    // don't forget the return type, mate. Also see below
    void 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. It is not a string, 
                 // but an int!
                 printf("\nName: %d\n",  ArrayPointer[i][index++]);
              } 
            index=0;         //Counter reset to 0
            // no need to increment the pointer. that's what the indexing by i 
            // above does
            // ArrayPointer++;  
          }
      }
    

    I keep preaching people asking questions the difference between a pointer and an array. It's crucial to write correct code. I hope i could help. At the end, just a little though about the difference between int[] and int*. The first is an incomplete array type, while the second is a complete type (pointer to int):

    typedef int Single[]; // array of indeterminate size.
    typedef int *Pointer; // pointer to int
    
    Single s1 = { 1, 2, 3, 4 }; // works!
    Pointer s2 = { 1, 2, 3, 4 }; // no no, doesn't work. s2 wants an address
    

    s2's type now has a type different from int[], because you initialized the array which would have incomplete type, the array s1 become complete after defined. It has type of int[4]. In parameter lists, however, there exist a special rule, which will cause any array type (even complete ones!) to be equivalent to a pointer to their first argument. Thus:

    void f(int *a) <=> void f(int a[]) <=> void f(int a[42]);
    void f(int (*a)[42]) <=> void f(int a[][42]) <=> void f(int a[13][42])
    // ...
    

    That's because you can't pass arrays by value. The compiler abuses that to make array types equivalent to pointers to their first element. Same deal with functions:

    void f(int a()) <=> void f(int (*a)())
    

    Because you can't pass functions by value (huh, doesn't even make sense at all to me), the compiler abuses it to make a function type in a parameter list equivalent to a pointer to that function type.

提交回复
热议问题