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

时间:2010-01-19 13:21:05

标签: c

代码:

/*
 * 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]);

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

5 个答案:

答案 0 :(得分:7)

试试这个:

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;
}

答案 1 :(得分:3)

您正在将一个指针数组传递给int:

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

答案 2 :(得分:0)

关于“保持不变”。你是通过引用传递东西,所以不让它们被编辑的方法是使它们成为常量。根据您不想更改的部分,您有几个不同的选项。但是,这不会让您在中更改它们。它听起来像是你想要一个使用数组无法在C ++中获得的传值,除非你自己制作手册。

答案 3 :(得分:0)

这似乎无法通过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");
}

答案 4 :(得分:0)

这也有效:

/*
 * 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");
}

指针算术完美无缺。