Я прочитал много дискуссий о передаче массивов в функции. Они, похоже, написаны для людей, свободно владеющих C. Я - варвар, еще не владеющий C.Как передать указатель на массив без распада и использовать «ссылку» в функции для barbarrians?
Из того, что я читал в других дискуссиях , должно быть возможно передать массив без уклона указателя. Тем не менее, мне нужна помощь в реализации этого.
Просьба привести краткий пример того, как передать массив как указатель указателя и определить его размер в пределах функции, которой он передан.
Если массив изменен в функции, я хочу, чтобы источник массива был изменен. И я хочу свести к минимуму дополнительное распределение памяти. И, если это вообще возможно, я бы хотел, чтобы размер массива внутри функции был равен .
Этот код работает без проезда.
// this works
j = sizeof(hourLongs)/sizeof(hourLongs[0]);
i = 0; while (now > hourLongs[i] && i < j){i++;}
hour = --i;
Это работает, но не может определить размер массива внутри функции.
hour = compareToLongs(&now, hourLongs, (int)(sizeof(hourLongs)/sizeof(hourLongs[0])));
// long *, long * , int -> int
// compare time to array of times.
static int compareToLongs(long * time, long * timeList_pointer, int size){
i = 0; while (*time> (timeList_pointer)[i] && i < size){i++;}
return --i;
}
Я хотел бы передать массив таким образом, чтобы он мог найти его размер внутри функции. Что-то вроде следующего, минус мои ошибки.
hour = compareToLongs(&now, &hourLongs);
// long *, (long (*) [])* -> int
// compare time to array of times.
static int compareToLongs(long * time, long ** timeList_pointer){
int size = (int)(sizeof(*timeList_pointer)/sizeof(*timeList_pointer[0]));
i = 0; while (*time> (i < size && *timeList_pointer)[i]){i++;}
free(size);
return --i;
}
Редактировать: hourLongs - это массив длинных целых чисел.
Редактировать: Что касается названия, я использовал слово «ссылка» в народном языке, чтобы другие варвары, подобные мне, могли найти вопрос.
Редактировать: Я действительно ищу способ задать массив целых чисел внутри функции.
sizeof(array)
дает некоторый адрес sizeof(), который позволяет определить размер. Это тот адрес, который я хотел бы передать своей функции.
Есть ли причина, по которой я не могу передать переданное значение sizeof() моей функции?
Редактирование: поскольку операция sizeof() предполагает, что массив может передаваться без «разложения указателя». user529758 дает три примера в this discussion
in C99 there are three fundamental cases, namely:
1. when it's the argument of the & (address-of) operator.
2. when it's the argument of the sizeof operator.
3. When it's a string literal of type char [N + 1] or a wide string literal of type wchar_t [N + 1] (N is the length of the string) which is used to initialize an array, as in char str[] = "foo"; or wchar_t wstr[] = L"foo";.
Что я стремлюсь делать, если возможно с помощью & массива.
Почему второй отрезанный провал снова? Это правильный способ сделать что-то. Единственное, что я не вижу смысла передавать указатель на «время», а не только его ценность. И .. форматирование. Не сохраняйте символы новой строки. –
Вы не можете напрямую передать массив как аргумент функции. Обычный способ передачи массива косвенно состоит в том, чтобы передать два аргумента: адрес 0-го элемента и длину массива. (В некоторых случаях вы можете опустить аргумент размера, если размер может быть определен из содержимого массива, например, конец строки обозначается символом '' \ 0''.) Я не уверен почему вам нужен указатель на указатель. Я отмечаю, что вы не показали нам определения объекта массива, который хотите передать. –
@KeithThompson Я ищу способ, который будет работать без символа, указывающего конец массива. – kjl