Код:
/*
* 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");
}
Мой компилятор не одобряет этот код. - [Предупреждение] передающего аргумента 1 из 'printArray' делает целое число из указателя без броска - printArray (array2, 4); - преобразованное в нижний индекс значение [Ошибки] не является ни массивом, ни указателем - printf (" %d", *iXArray[iCntr]);
Что я делаю неправильно, и почему? Как я фиксирую это?
Попробуйте это:
void printArray(int **iXArray, int iSize) ...
В вашем примере вы предоставляете массив (int *), поэтому ссылка на него как один, вы должны сообщить компилятору ожидать массива указателей.
По умолчанию передается массив посредством ссылки. Если вы измените контент массива, он меняется на стороне Callee Aswell. Сам указатель пропускается по значению, поэтому изменение значения параметра IXARRAY ( IXARRAY = (INT **) 123;
) не изменит указатель Array2
на стороне Callee.
Если вы хотите пройти массив по значению, нужно будет обернуть его в типе значений:
typedef struct {
int A[123];
} Array;
Array incrementArray(Array array, int count) {
for (int i=0; i<count; i++) {
array.A[i]++;
}
return array;
}
Относительно «остаться нетронутым». Вы проходите вещам посредством ссылки, поэтому способ удержать их от редактирования - сделать их const. У вас есть пара разных вариантов, основанных на какой части вы не хотите меняться. Однако это не позволит вам изменить их в . Как называется, вы хотите, чтобы вы не можете получить C ++, используя массивы, если вы не сделаете собственную ручную копию.
Это, кажется, работает, не делая Array1 редактируемой PrintArray.
/*
* 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");
}
Вы проходите массив указателей на INT:
void printArray(int *ixArray[], int iSize)
Это работает также:
/*
* 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");
}
Указатель Arithmetics работает отлично работает.