работа с указателем char и целочисленным указателем

Мой вопрос касается разыменования указателя char

Вот мой код -

#define MAX 10

char s[80]="Hello";

int main(){

    char *stackValue;

    stackValue=&s;//here I assined the address of s to stackValue

    if(!stackValue){

        printf("No place for Value");

        exit(1);

    }

    else{

        printf("\n%s",*stackValue);//This doesn't work with * before it 

        printf("\n%s",stackValue);//This works properly
    }
    return 0;
}

В приведенном выше коде я назначил адрес S[] для stackValue, и когда я печатаю *stackValue, он не работает,

Но если я напечатаю только 'stackValue', это сработает.

Когда я делаю то же самое с Integer

int main(){
    int i=10, *a; 
    a=&i;
    printf("%d",*a);//this gives the value 
    printf("%d",a)//this gives the address
    return 0;
}

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

Помоги мне?


person uniqueNt    schedule 29.11.2016    source источник


Ответы (3)


С первым фрагментом кода:

stackValue=&s; неверно, учитывая, что s уже является массивом для char. Если вы пишете так, то stackValue становится указателем на указатель на char (а не указателем на char).

Исправьте это, изменив на stackValue=s;

Кроме того, снова %s ожидается указатель на char (НЕ указатель на указатель на char) - это объясняет, почему это не работает printf("\n%s",*stackValue); // this doesn't work

Вместо этого вам нужно printf("\n%s",stackValue);.


Со вторым фрагментом кода.

a=&i; подходит, потому что i — это один int, а НЕ массив.

person artm    schedule 29.11.2016
comment
да, но мой вопрос все еще остается, когда я использую *stackValue, он не печатает значение s[], а печатает значение int, и когда я печатаю 'stackValue', он печатает только значение - person uniqueNt; 29.11.2016
comment
неважно, что он печатает - это неопределенное поведение (это означает, что все может случиться). Ваш код неверен с самого начала, поэтому нет особого смысла уточнять неправильный printf. - person artm; 29.11.2016
comment
Я снова изменил свой код, но он не дает правильного вывода - person uniqueNt; 29.11.2016
comment
@NitinTiwari принимает ответ — это нормально, но вы должны сначала проголосовать, прежде чем принять - person artm; 29.11.2016
comment
Извините, я сделал - person uniqueNt; 10.12.2016

То, что вы пытаетесь сделать, это:

int main(void)
{
    char a_data = "Hello, this is example";
    char *pa_stack[] = {a_data};

    printf("We have: %s\n", *pa_stack);
}
person MrMuMu    schedule 29.11.2016

Спецификатор формата "%s" для printf всегда ожидает аргумент char*. так что это рабочее и правильное утверждение

printf("\n%s",stackValue);

и в первом выражении вы передаете значение, поэтому оно даст вам неопределенное поведение.

person Mohan    schedule 29.11.2016