main
должен возвращать тип. Вы забыли поставить «int» в качестве возвращаемого типа (неявный int в C ++ запрещен).
Сказав это, я не уверен, что вы подразумеваете под
// It does not print the data
printf("\nName: %s", ArrayPointer[index++]);
ArrayPointer[index++]
будет, как определено в списке параметров, вернуть int
. Как это должно хранить имя ? Он будет хранить целое число !
Еще раз сказано, что вы не можете вызывать эту функцию (каламбур) с этим конкретным аргументом. Давайте рассмотрим ваши типы:
int Data1[] = {10,10};
int Data2[] = {20,20};
int Data3[] = {30,30};
int *NameList[] = {Data1, Data2, Data3};
Data1 Data2 Data3 NameList
int[2] int[2] int[2] int*[3]
Вопреки тому, что вы сказали, NameList является , а не указателем на массив массивов. Я чувствую, что должен показать вам, что это будет:
int (*NameList)[N][M] = Some3DimensionalArray;
Это не имеет смысла вообще. Так что у тебя есть?
Data1 = array of 2 int
Data2 = array of 2 int
Data3 = array of 2 int
NameList = array of poiners to int
Это - это то, что вы получили. И вы передаете NameList
в функцию, которая хочет указатель на int
. Это должно произойти сбой уже во время звонка Function
в main
! Я понятия не имею, что вы подразумеваете под name
в этой строке в функции. Но если вы хотите распечатать целые числа, которые хранятся в массивах, на которые указывают (указатели на их первый элемент), вы можете сделать это так (сохраняя ваш код настолько, насколько я могу):
// don't forget the return type, mate. Also see below
void Function(int **ArrayPointer)
{
int i, j, index=0;
for (i=0; i < 3; i++)
{
for (j=0; j < 2; j++)
{
// It does not print the data. It is not a string,
// but an int!
printf("\nName: %d\n", ArrayPointer[i][index++]);
}
index=0; //Counter reset to 0
// no need to increment the pointer. that's what the indexing by i
// above does
// ArrayPointer++;
}
}
Я продолжаю проповедовать людям, задающим вопросы о разнице между указателем и массивом. Важно написать правильный код. Я надеюсь, что смогу помочь. В конце, немного о разнице между int[]
и int*
. Первый тип является неполным массивом, а второй - полным типом (указатель на int):
typedef int Single[]; // array of indeterminate size.
typedef int *Pointer; // pointer to int
Single s1 = { 1, 2, 3, 4 }; // works!
Pointer s2 = { 1, 2, 3, 4 }; // no no, doesn't work. s2 wants an address
Тип
s2
теперь имеет тип , отличный от типа int [] , поскольку при инициализации массива, который будет иметь неполный тип, массив s1
станет завершенным после определения. Имеет тип int[4]
. Однако в списках параметров существует специальное правило, которое позволяет любому типу массива (даже полному!) Быть эквивалентным указателю на их первый аргумент. Таким образом:
void f(int *a) <=> void f(int a[]) <=> void f(int a[42]);
void f(int (*a)[42]) <=> void f(int a[][42]) <=> void f(int a[13][42])
// ...
Это потому, что вы не можете передавать массивы по значению. Компилятор использует , чтобы сделать типы массивов эквивалентными указателям на их первый элемент. То же самое касается функций:
void f(int a()) <=> void f(int (*a)())
Поскольку вы не можете передавать функции по значению (да, для меня это вообще не имеет смысла), компилятор использует для создания типа функции в списке параметров, эквивалентном указателю к этому типу функции.