передача символа на символ * - PullRequest
0 голосов
/ 28 декабря 2010

у меня есть этот кусок кода

int main()
{
    char a[100];
    a[0]='a';
    a[1]='b';
    fun(a[0]);
}

void fun(char *a)
{
    printf("%c",a);
}

но я передаю символ указателю. Не будет ли указатель ожидать адрес ???

Ответы [ 4 ]

3 голосов
/ 29 декабря 2010

a[0] содержит значение 97 ('a' в ASCII).fun получит значение 97 в a, но интерпретирует его как адрес.Однако, поскольку вы только передаете его на printf и случайно используете форматер %c, который будет интерпретировать a как char, вы все равно получите a.

Конечно, на большинстве компиляторов вы должны получать предупреждения о том, что:

  1. Вы преобразуете целое число в указатель (когда вы вызываете fun), не приводя его к указателю.
  2. Форматер %c в printf должен принимать char, а не char *.
1 голос
/ 28 декабря 2010

Вы вызываете функцию, у которой нет прототипа в точке вызова. C89 говорит, что это разрешено, но ваша задача - убедиться, что функция вызывается с аргументами, которые верны для параметров, с которыми она в конечном итоге определяется. Так как они не совпадают в этом случае, неопределенное поведение.

Включите больше предупреждений компилятора (-Wall в случае gcc).

0 голосов
/ 28 декабря 2010

Решение 1. Не используйте указатель.

void fun(char a);

Решение 2. Если вам нужно использовать указатель по какой-то не совсем очевидной причине, используйте & для получения указателя и * разыменовать указатель.

void fun(char *a);
int main()
{
    char a[100];
    a[0]='a';
    a[1]='b';
    fun(&a[0]);
}

void fun(char *a)
{
    printf("%c",*a);
}  
0 голосов
/ 28 декабря 2010

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

fun () ожидает указатель на символ, но вы передаете символ.Это должно генерировать синтаксическую ошибку.Или, по крайней мере, не работает правильно, если вы действительно не объявили функцию fun ().

Символы - это целочисленные типы, которые копируются при назначении.

...