Большинство языков высокого уровня (Python, Ruby, даже Java) используют ссылку pass-by. Очевидно, что у нас нет ссылок на C, но мы можем имитировать их с помощью указателей. Для этого есть несколько преимуществ. Например:Передача по ссылке в C - минусы?
int findChar(char ch, char* in)
{
int i = 0;
for(i = 0; in[i] != '\0'; i++)
if(in[i] == ch)
return i;
return -1;
}
Это общая парадигма C: поймать ненормальное ошибочное положение, возвращая некоторое значение ошибки (в данном случае, вернуть -1
если символ не в строке).
Проблема с этим: что, если вы хотите поддерживать строки больше, чем 2^31 - 1
символов? Очевидным решением является возврат unsigned int
, но это не будет работать с этим значением ошибки.
решение что-то вроде этого:
unsigned int* findChar(char ch, char* in)
{
unsigned int i = 0;
for(i = 0; in[i] != '\0'; i++)
if(in[i] == ch)
{
unsigned int index = (unsigned int*) malloc(sizeof(unsigned int));
*index = i;
return index;
}
return NULL;
}
Есть некоторые очевидные оптимизаций, которые я не делал ради простоты, но вы получите идею; return NULL в качестве значения ошибки.
Если вы делаете это со всеми своими функциями, вы также должны передавать свои аргументы в виде указателей, чтобы вы могли передавать результаты одной функции аргументам другого.
Есть ли недостатки в этом подходе (помимо использования памяти), которые мне не хватает?
EDIT: Я хотел бы добавить (если это не совсем очевидно, мой вопрос), что у меня есть некоторый опыт в C++, но я довольно много начинающий на C.
Java * не * использование проходить по ссылке. Он использует pass by value, но для ссылочных типов передаваемое значение является ссылкой. Между этим и «реальным» переходом по ссылке существует большая разница. Python и Ruby могут быть одинаковыми - я не уверен. ИМО стоит быть очень точным с терминологией здесь. –
@Jon Skeet: да, значения в Python и Ruby работают так же, как ссылки на Java, но терминология отличается в этих сообществах. – newacct
@ Jon Skeet: Это один из способов думать об этом; Я склонен думать об этом, поскольку Java является передачей по ссылке, за исключением примитивов, которая выходит на одно и то же в разных словах. Каждому свое. :) – Imagist