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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2014, 22:00   #1
Qaliti
Форумчанин
 
Регистрация: 04.01.2010
Сообщений: 229
По умолчанию Глупые вопросы про указатели

Доброго времени суток

Надеюсь на помощь в очередной раз ) столько раз вы мне помогали, уважаемые программисты, даже не знаю что бы я без вас делал..

Все не могу разобраться в указателях. Вроде все элементарно, а на практике они для меня такая задница..

Есть рабочая программа (программа считает выражение полученное из переданных параметров при запуске и выводит результат (запуск происходит из батника, он же и записывает этот результат в отдельный файл)):
Код:
#include "stdafx.h"
#include "iostream"

int main(int argc, char* argv[])
{	
	int sum = 0; // результат выражения
	char * hh = NULL; //хранит указатель на первый символ очередного аргумента переданного командной строки
	char * z = NULL; // указатель на символ математической операции получаемый из функции strtol
	char znak = NULL; // сохраняем этот знак для последующего применения
	int param = 0; // сюда сохраняется число полученное из аргументов для последующей операции с ним

	for ( int i = 1; i < argc; i++) {
		hh = argv[i];
		param = strtol(hh, &z, 10);
		if ( i == 1 ) sum = param;
		if (*z == '\0') {
			switch(znak) {
			case '+':
				sum += param;
				break;
			case '-':
				sum -= param;
				break;
			case '*':
				sum *= param;
				break;
			case '/':
				sum /= param;
				break;
			}
		} else {
			znak = *z;
		}
	}
	printf("%d", sum);
	return 0;
}
Ну и сам батник:
Код:
1_1.exe 5 + 6 * 10 / 5 > out.txt
В этой программе все работает, кое-как я её и написал, методом тыка, не понимая как тут работают указатели..
А теперь вопросы )

Для начала такое уточнение, если argv[] содержит указатели на первые символы строк являющихся аргументами переданными программе при запуске, то написав char* argv[] мы передаем разыменованный массив строк? просто я совсем не очень понимаю смысла char*

Далее.
Код:
...
char * hh = NULL;
...
hh = argv[i];
...
почему блин это работает?? )) мы создаем пустой указатель hh, потому нужно в этот указатель занести адрес первого символа аргумента.. Нужно же тогда написать hh = &argv[i]; , & для того что бы получить адрес первого символа, но это неправильно... почему так нельзя сделать, и почему работающий вариант правильны? когда мы вроде как указателю присваиваем значение переменной, а не адрес на это значение

Далее. param = strtol(hh, &z, 10); Почему тут нужно получать адрес переменной z, написав &z, когда у нас и так указатель? Мы же тут char * z = NULL; создали указатель, какого хрена нужно получать адрес адреса что бы это работало... Логичнее же написать так param = strtol(hh, z, 10); Во второй же параметр нам нужно передавать указатель в который занесется адрес первого попавшегося не числового символа... Вот например hh тут тоже передается как адрес начала первого символа передаваемого аргумента, но тут мы его пишем нормально, без &

Зарание большое спасибо
Qaliti вне форума Ответить с цитированием
Старый 04.01.2014, 22:37   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,308
По умолчанию

char* argv[] - переменная с именем argv является массивом ([]), содержащем указатели на char (char *) или, по-другому, это массив указателей. argv[i] уже указатель на начало строки, поэтому не нужно получать адрес. strtol должен получить два указателя и систему счисления. Через второй параметр возвращается адрес нужного символа. Чтобы функция могла изменить значение переменной z, она должна получить адрес этой переменной. Первый параметр функции должен быть указателем на начало строки, и его функция никак не изменяет, поэтому он передается как есть.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 04.01.2014 в 22:41.
BDA вне форума Ответить с цитированием
Старый 05.01.2014, 00:15   #3
Qaliti
Форумчанин
 
Регистрация: 04.01.2010
Сообщений: 229
По умолчанию

Но попытки использовать массив, как массив указателей неудачны, и его можно использовать только как обычный массив содержащий значения переданных аргументов... например:
Код:
#include "stdafx.h"
#include "iostream"

int main(int argc, char* argv[])
{	
	printf("%s", *argv[1]);
	return 0;
}
с таким батником:
Код:
1_1.exe 5 > out.txt
не будет работать, и выведет ошибку даже на процессе компиляции..ведь argv[] содержит только указатели, значит их нужно разыменовывать с помощью *.. следуя логике
но получается на практике что argv[] нужно использовать как массив значений аргументов, и написав printf("%s", argv[1]); он заработает, выведет число 5 в файл
Qaliti вне форума Ответить с цитированием
Старый 05.01.2014, 00:24   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,308
По умолчанию

printf("%s") требует указателя на начало строки, а argv[i] как раз и является им.

UPD
Пожалуйста.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 05.01.2014 в 00:46.
BDA вне форума Ответить с цитированием
Старый 05.01.2014, 00:28   #5
Qaliti
Форумчанин
 
Регистрация: 04.01.2010
Сообщений: 229
По умолчанию

охх )) теперь все ясно )) большое спасибо вам!
Qaliti вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
глупые вопросы TotKtoNado Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 09.11.2011 17:04
Указатели в c++, вопросы новичка Enchance Помощь студентам 10 07.09.2011 19:02
Про указатели Peperovich Общие вопросы C/C++ 7 22.06.2011 19:46
Ассемблеры (TASM) глупые вопросы Another_Lamp Помощь студентам 4 29.11.2009 15:49
Вопросы новичка про C++ k1r1ch C++ Builder 5 25.11.2009 15:11