【问题标题】:Passing an array containing pointers to a function properly正确传递包含指向函数的指针的数组
【发布时间】:2010-01-19 13:21:05
【问题描述】:

代码:

/*
 * code.c
 */
#include <stdio.h>

void printArray(int iXArray, int iSize);

int main() {
    int array1[] = {7, 9, 3, 18};
    int *array2[] = {array1 + 0, array1 + 1, array1 + 2, array1 + 3};

    printArray(array2, 4);

    return 0;
}

// This should print the values in array1
void printArray(int iXArray, int iSize) {
    int iCntr;
    for (iCntr = 0; iCntr < iSize; iCntr++) {
        printf("%d ", *iXArray[iCntr]);
    }
    printf("\n");
}

我的编译器不认可这段代码。 - [警告] 传递 `printArray' 的 arg 1 从指针生成整数而不进行强制转换 - printArray(array2, 4); - [错误] 下标值既不是数组也不是指针 - printf("%d", *iXArray[iCntr]);

我做错了什么,为什么?我该如何解决这个问题?

【问题讨论】:

    标签: c


    【解决方案1】:

    试试这个:

    void printArray(int **iXArray, int iSize) ...
    

    在您的示例中,您提供了一个 (int*) 数组,因此将其作为一个引用,您必须告诉编译器期望一个指针数组。

    默认情况下,通过引用传递数组。如果您更改数组的内容,它也会在被调用方一侧更改。指针本身是按值传递的,所以改变iXArray参数(iXArray = (int**)123;)的值不会改变被调用方的array2指针。

    如果要按值传递数组,则需要将其包装在值类型中:

    typedef struct {
      int A[123];
    } Array;
    
    Array incrementArray(Array array, int count) {
        for (int i=0; i<count; i++) {
            array.A[i]++;
        }
        return array;
    }
    

    【讨论】:

    • 我应该提一下,如果我决定使用此函数对其进行编辑,我希望第一个数组保持不变。如果我要编辑array2,我会更改指针。
    • 结构体的修改应该允许你这样做。
    【解决方案2】:

    您正在传递一个指向 int 的指针数组:

    void printArray(int *ixArray[], int iSize)
    

    【讨论】:

      【解决方案3】:

      这也有效:

      /*
       * code.c
       */
      #include <stdio.h>
      
      void printArray(int **iXArray, int iSize);
      
      int main() {
          int array1[] = {7, 9, 3, 18};
          int *array2[] = {array1 + 0, array1 + 1, array1 + 2, array1 + 3};
      
          printArray(array2, 4);
      
          return 0;
      }
      
      // This should print the values in array1
      void printArray(int **iXArray, int iSize) {
          int iCntr;
          for (iCntr = 0; iCntr < iSize; iCntr++) {
                  printf("%d ", *iXArray[iCntr]);
          }
          printf("\n");
      }
      

      指针算法完美运行。

      【讨论】:

        【解决方案4】:

        关于“保持不变”。您通过引用传递事物,因此防止它们被编辑的方法是使它们成为常量。根据您不想更改的部分,您有几个不同的选项。但是,这不会让您在您的功能中更改它们in。听起来你想要一个值传递,除非你自己手动复制,否则你无法使用数组在 C++ 中获得它。

        【讨论】:

          【解决方案5】:

          这似乎可以在不让 printArray 编辑 array1 的情况下工作。

          /*
           * code.c
           */
          #include <stdio.h>
          
          void printArray(int *iXArray[], int iSize);
          
          int main() {
              int array1[] = {7, 9, 3, 18};
              int *array2[] = {&array1[0], &array1[1], &array1[2], &array1[3]};
          
              printArray(array2, 4);
          
              return 0;
          }
          
          // This should print the values in array1
          void printArray(int *iXArray[], int iSize) {
              int iCntr;
              for (iCntr = 0; iCntr < iSize; iCntr++) {
                  printf("%d ", *iXArray[iCntr]);
              }
              printf("\n");
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-08-05
            • 1970-01-01
            • 1970-01-01
            • 2017-08-09
            • 1970-01-01
            • 2021-08-20
            • 2021-02-12
            相关资源
            最近更新 更多