正确传递包含指向函数的指针的数组

Posted

技术标签:

【中文标题】正确传递包含指向函数的指针的数组【英文标题】: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]);

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

【问题讨论】:

【参考方案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");

【讨论】:

以上是关于正确传递包含指向函数的指针的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将浮点指针从 C 库传递到其 C# 包装器

访问包含在数组中的指向类对象的类成员函数的正确语法是啥?

从函数 C++ 正确传递指针

C ++从函数返回指向数组的指针的正确方法

为啥指针不能传递正确的值(C)?

将指向数组的指针传递给函数时出现分段错误(C++)