Большинство языков высокого уровня (Python, Ruby, даже Java) используют справочные ссылки. Очевидно, что у нас нет ссылок в 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;
}
Есть некоторые очевидные оптимизации, которые я не сделал для простоты, но вы поняли идею; верните NULL в качестве значения ошибки.
Если вы делаете это со всеми своими функциями, вы также должны передавать свои аргументы как указатели, чтобы вы могли передавать результаты одной функции аргументам другой.
Есть ли недостатки этого подхода (помимо использования памяти), который мне не хватает?
РЕДАКТИРОВАТЬ: Я хотел бы добавить (если это не совсем очевидно по моему вопросу), что у меня есть некоторый опыт в C ++, но я в значительной степени начинающий в C.