正确传递包含指向函数的指针的数组
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");
【讨论】:
以上是关于正确传递包含指向函数的指针的数组的主要内容,如果未能解决你的问题,请参考以下文章