Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2012, 13:14   #1
beetle
 
Аватар для beetle
 
Регистрация: 15.08.2009
Сообщений: 3
По умолчанию Массивы указателей

Возник вопрос по работе с массивами указателей. В коде ниже часть примера с книги Кернигана и Ритчи (глава 5.10 Аргументы командной строки)

main(int argc, char *argv[])
{
int c;

while (--argc > 0 && (*++argv)[0] == '-')
while (c = *++argv[0])
switch (c) {
............
}

Во второй части условия первого цикла проверяется первый элемент каждого аргумента командной строки. По логике работы программы, во втором цикле просматриваются все параметры текущего аргумента после знака -. Но по моему пониманию и правилам приоритетности, выражение *++argv[0] эквивалентно *(++(argv[0])) т.е. argv[0] - указывает на первый элемент в массиве указателей argv; ++(argv[0]) - указатель на следующий после argv[0], это argv[1]; *++argv[0] - значение на которое указывает argv[1] (первый символ второго аргумента командной строки). А это не верно. В чем ошибка моих рассуждений.
beetle вне форума Ответить с цитированием
Старый 04.01.2012, 14:05   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
++(argv[0]) - указатель на следующий после argv[0], это argv[1]; *++argv[0] - значение на которое указывает argv[1] (первый символ второго аргумента командной строки).
вот это не так.

делая "[0]" вы уже разыменовываете указатель и получаете указатель на строку,
только затем вы делаете инкремент указателя, и ставите указатель с 1-го символа на 2ой.
чтобы перейти к следующему параметру надо сделать (++argv)
onewho вне форума Ответить с цитированием
Старый 04.01.2012, 18:36   #3
beetle
 
Аватар для beetle
 
Регистрация: 15.08.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
чтобы перейти к следующему параметру надо сделать (++argv)
Понял, спасибо. Т.е. передать функции void func(char *) указатель к примеру на второй аргумент можно func(++argv), а запись func(argv[1]) передает функции указатель на второй символ первого аргумента?
beetle вне форума Ответить с цитированием
Старый 04.01.2012, 20:08   #4
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

ну разыменования то делать все равно надо будет.
onewho вне форума Ответить с цитированием
Старый 04.01.2012, 23:55   #5
beetle
 
Аватар для beetle
 
Регистрация: 15.08.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
ну разыменования то делать все равно надо будет.
Да, ошибся, правильно будет для предыдущего моего поста не func(++argv), а func(*++argv).
beetle вне форума Ответить с цитированием
Старый 05.01.2012, 07:38   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от beetle Посмотреть сообщение
а запись func(argv[1]) передает функции указатель на второй символ первого аргумента?
Нет, запись func(argv[1]) означает тоже самое, что и func(*++argv)

А чтобы "передать функции указатель на второй символ первого аргумента", нужно:

Код:
#include <stdio.h>

void func (char*);

int main(int argc, char *argv[]) 
{
    func(++argv[0]);
    return 0;
}

void func(char* s)
{

}
P.S. Если только вы ведёте отсчёт, начиная с единицы.

Последний раз редактировалось 8Observer8; 05.01.2012 в 08:30.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерные массивы(массивы указателей на массивы) krytishka99 Помощь студентам 1 29.12.2011 19:51
указатели на массивы и массивы указателей blacktener Общие вопросы C/C++ 16 13.06.2011 20:45
Массив указателей nattaella Компоненты Delphi 2 11.06.2011 16:40
массив указателей RUSt88 Общие вопросы C/C++ 12 10.01.2010 11:11
Использование указателей (*) Crazy_caramel Помощь студентам 0 16.12.2009 22:06