Передача одиночного указателя на символ функции C - PullRequest
0 голосов
/ 21 марта 2020

это может быть элементарная проблема, но я не могу найти решение.

У меня есть такой код:

int main(){
   char val = 'I';
   function(&val);
   return 0;
}

и функция:

void function(char* val){
    if (*val == 'I') {
         *val = 'S';
    }
}

Однако функция, похоже, интерпретирует char * как массив символов, в то время как мне нужно получить доступ только к одному символу, но мне также нужно изменить его значение в этой функции. Какое простое решение я могу использовать для этого?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 21 марта 2020

Все массивы в C интерпретируются как указатель на первый элемент, и любой указатель может использоваться в качестве базы массива для доступа к n-му элементу с синтаксисом [n] . Если вы хотите изменить значение этого символа внутри функции, то вы должны передать указатель на него, но нет проблем с доступом к нему, как вы:

    if (*val == 'I') {
         *val = 'S';
    }

Это больше о том, что ваша функция ожидает от ввода, если она ожидает, что ввод будет указателем на один символ, тогда вполне нормально получить char * и получить доступ только к тем данным, на которые указывает указатель , В C, когда у вас есть указатель p , вы не можете ограничивать себя в обработке его как базы массива и записи p [5], даже если он указывает на один символ, p [5 ] будет просто продвигаться в 5 раз на размер char и обрабатывать все найденные данные как char и возвращать их.

И обычно, когда функция получает буфер как указатель, он также получает размер этого буфера в качестве параметра, например: void function (char * buf, int buf_length)

То, что вы, вероятно, ищете, доступно в C ++ и называется передавая по ссылке , вы можете прочитать об этом здесь .

В C ++ это будет работать:

// The & here indicates that val is received by reference, meaning that
// if we change val here, it will be also changed where we passed it from.
// Behind the scene it is done by passing a pointer(char*) and replacing
// every access to the variable with dereferencing and then accessing:
// val == 'I' -> *val == I     or val = 'S' with *val = 'S'
void function(char &val){ 
    if (val == 'I') {
        val = 'S';
    } 
}

int main(){
   char val = 'I';
   function(val); // passing as normal char, but will be passed by reference
   return 0;
}
0 голосов
/ 21 марта 2020

Спасибо всем, кто нашел время, чтобы ответить. По-видимому, у меня были неправильно позиционированные параметры char * и int, поэтому компилятор не выдал это за ошибку, поскольку они могут интерпретировать друг друга. Я думаю, достаточно кодирования для меня сегодня ^^.

0 голосов
/ 21 марта 2020

Вы можете интерпретировать указатель как массив с индексом 0.

void function(char* val) {
    if (val[0] == 'I') {
         val[0] = 'S';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...