C char указатель получает указанный c символ - PullRequest
0 голосов
/ 13 февраля 2020

, вероятно, глупый вопрос, но как получить доступ к указанному символу c в указателе символа?

Я пытался следовать ...

char *pointer = "Hello";
printf("%s", pointer); // prints "Hello"
printf("%s", &pointer[0]); // also prints "Hello"

Но что я хочу is printf (???) => "H". Единый персонаж. Или «е». Как это возможно?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2020

pointer - указатель на char, также называемый char *.

После char *pointer = "Hello";, pointer указывает на «Н».

Когда printf дается %s, он принимает char * и печатает все символов, которые он находит, начиная с этого места, до тех пор, пока не будет замечен нулевой символ.

Чтобы сообщить printf чтобы напечатать один символ, передайте ему фактическое значение символа (не указатель) и используйте %c:

printf("%c", *pointer);

или:

printf("%c", pointer[0]);

или, для «е» вместо «Н»:

printf("%c", pointer[1]);
1 голос
/ 13 февраля 2020

Вы хотите получить доступ к char из char*, просто используйте оператор [], как массивы.

char *pointer = "Hello";
printf("%s", pointer); // ok
printf("%s", &pointer[0]); // wrong way of accessing specific element (it is same as the base address.., thus %s prints the whole thing)

Вместо этого вы получаете доступ к адресу первого элемента char* или строковый литерал .. почему!

printf("%c", pointer[0]); // use this one 

Точно так же, как массивы, получить доступ к необходимому элементу.

Однако, чтобы получить его лучше, обратите внимание здесь:

#include <stdio.h>

int main() {

    char *pointer = "Hello";
    printf("%s\n\n", pointer); // ok
    printf("%c", pointer[0]); 

    printf("%p == %p\n", (void *)&pointer[0],(void *)pointer);
    // cast to void * to avoid undefined behavior 
    // pointed out by @ex nihilo 


    printf("%p", pointer+1); 


    return 0;
}

Вывод:

Hello
H0x55da21577004 == 0x55da21577004
0x55da21577005

, как вы можете видеть, pointer содержит адрес первого элемента: &pointer[0], таким образом, вы получите тот же вывод.

1 голос
/ 13 февраля 2020
    char* pointer = "Hello";

Создает указатель и назначает его базовому адресу «Hello».

указатель и & pointer [0] - это одно и то же.

pointer [n] принимает адрес "Hello" и смещает его по номеру 'n', не указывайте индекс конца адреса, иначе вы прочтете rubbi sh.

Итак:

    pointer[0] = 'H'
    pointer[1] = 'e'
    pointer[2] = 'l'
    pointer[3] = 'l'
    pointer[4] = 'o'
    pointer[5] = 0
...