Операции с двумя указателями - PullRequest
3 голосов
/ 25 марта 2012

Предположим, у меня есть char **argv.

Во-первых, как мне распечатать все строки в argv?Я попробовал следующее:

char *temp;
temp = *argv; // Now points to the first string?
while (temp != NULL) {
    printf("%s ", temp);
    temp++;
}

Здесь при увеличении temp пропускается только один символ.Почему это происходит?Я знаю, что argv это массив, который содержит точки.Каждый указатель указывает на массив char*.Если так, то почему это не работает?Я знаю, что, поскольку temp имеет тип char, увеличение этого указателя увеличит его на 1 символ (или байт).Если так, как я могу увеличить указатель на следующий массив и вывести эту строку?

Ответы [ 5 ]

6 голосов
/ 25 марта 2012

Пропускается только один символ, потому что temp является указателем на char.Добавляя один, вы говорите компилятору переместить указатель так, чтобы он указывал на следующую char в памяти.

argv - это массив указателей.Что вам нужно сделать, это перейти к следующему указателю на каждой итерации.Что-то вроде:

char **temp = argv;  // temp is a pointer to a *pointer*, not a pointer to a *char*
while (*temp != NULL) {
    printf("%s ", *temp);
    temp++;
}
6 голосов
/ 25 марта 2012

Вам нужно увеличить argv, а не *argv. С локальной копией это выглядит так:

for (char ** p = argv; *p; ++p)      // or "*p != NULL"
{
    char * temp = *p;                // now points to the first string!
    printf("%s ", temp);             // or just "printf("%s", *p);"
}
1 голос
/ 25 марта 2012

Во-первых, вам нужно понять, что такое char** argv. Это массив указателей на char. Указатели в этом массиве не обязательно находятся рядом друг с другом в адресном пространстве. То, что вы хотите, это:

char** temp;
temp = argv;
while(temp != argv + argc) {
    printf("%s ", temp);
    temp++;
}

У вас должен быть указатель на первый элемент массива, чтобы указатели на char. Увеличивайте это вместо этого.

0 голосов
/ 25 марта 2012

что вы, вероятно, хотите сделать, это:

char* a = argv[0];  // first arg
char* b = argv[1];  // second arg
char* c = argv[2];  // third arg

что эквивалентно этому:

char* a = *(argv + 0);
char* b = *(argv + 1);
char* c = *(argv + 2);

, который вы затем хотите обобщить в цикл.

0 голосов
/ 25 марта 2012

Вы должны увеличить argv, а не *argv. Обратите внимание, что если ваш argv является параметром функции main, его можно изменить, и вы можете использовать его следующим образом:

    while (*argv++) {
        printf("%s\n", *argv);
    }
...