указатель c со строкой - PullRequest
1 голос
/ 10 апреля 2011

Пытаясь выучить указатели лучше, я написал этот код.Намерение состояло в том, чтобы печатать один символ строки за раз в цикле for.Снова пытаемся научиться увеличивать указатель, а затем разыменовывать указатель.

char *string = "abcdef";
char *pointer = &string; 

for (int i =0; i < 4; i++)

{   
    printf("the next charater is %c\n", *pointer);
    pointer = (char *)pointer + sizeof(char);
}

хотите, чтобы он напечатал:

следующий символ -

следующий символ -b

следующий символ - c

следующий символ - d

Ответы [ 3 ]

4 голосов
/ 10 апреля 2011
char *pointer = &string; 

должно быть

char *pointer = string; 

string - переменная-указатель, которая содержит адрес вашего строкового литерала. Вам нужен адрес строкового литерала, поэтому вы должны просто скопировать значение в string - не брать адрес локальной переменной-указателя - ваш текущий код дает вам указатель на указатель на строку.

Кроме того, pointer = (char *)pointer + sizeof(char); не требует приведения и не должен использовать sizeof(char). При увеличении переменной типа pointer to X ее увеличение на единицу увеличивает ее на sizeof(X) байт - увеличение на единицу до следующего X. Вместо этого используйте pointer += 1; или ++pointer.

2 голосов
/ 10 апреля 2011

Если вы хотите напечатать (или иным образом обработать) всю строку по одному символу за раз, вы можете использовать следующую идиому:

char *p = /* ... */;

while (p && *p) {
    printf("next char: %c\n", *p++);
}

Условие сначала проверяет, является ли p значением NULL, т.е.Целесообразно разыменовывать р вообще.Если p не равно NULL, *p проверяет, достигли ли вы уже конца строки, обозначенного символом '\0', который равен 0.

0 голосов
/ 22 февраля 2015

Если вы хотите использовать указатель на указатель на строку, вы можете использовать так:

char *string = "abcdef";
char **pointer = &string;
int i;
for (i =0; i < 4; i++)

{
    printf("the next charater is %c\n", **pointer);
    *pointer = *pointer + sizeof(char);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...