Задать вопрос
Vilibb
@Vilibb
Пытаюсь изучить какой-либо ЯП.

В чем различие void func(char * var) от void func(char **var)?

Как работает void func(char * var) и void func(char **var) и как обращаться к элементам в каждом случае?
Так же непонятно - во втором случае, если мне нужно получить доступ к var[i], как мне к нему обратиться?
Почему во втором случае я должен передавать переменную через адрес?
Т.е.:
char * tmp = "string";
func(&tmp);

Тему про указатели прочитал уже вдоль и поперек. Они никак не уложатся в голове.
  • Вопрос задан
  • 304 просмотра
Подписаться 1 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Это плохо. Указатели - основа С, без понимания того, как работают указатели, будет ооочень трудно.

char *var - указатель на переменную типа char. Сама var содержит адрес, шестнадцатеричное число, размер его зависит от реализации, от ОС, от платформы etc. Этот адрес указывает на область памяти длиной 1 байт (потому что char *), соответственно в эту область можно поместить 1 байт. Если поместить туда скажем переменную типа short int (два байта), то можно получить опять же в зависимости от того, как получали под нее память либо затирание соседней переменной (что не всегда плохо и очень часто используется для обнуления областей), либо SIGSEGV, то есть нарушение защиты памяти, запись в область памяти не выделенную программе.
char ** var - указатель на указатель на переменную типа char. Сама var, как и раньше содержит адрес, но теперь этот адрес указывает на область памяти размером с указатель (он фиксированный в пределах реализации) и по этому адресу записан адрес области, в которую можно поместить 1 байт (со всеми вытекающими последствиями).
Зачем такие извращения? Ну, например для упрощения вызова функции - передавать один параметр или же 4-5. Обработка списков, деревьев и всего, что строится на их основе. Данная конструкция очень распространена, рекомендую проработать пару демок в отладчике - с дотошным разбором, где что находится, как откуда и куда извлекается...
Ответ написан
flygrounder
@flygrounder
Python/Django
char* var - одномерный указатель типа char
Его можно использовать так:
1)
char t='1';
char* var=&t;
*var = '2';

2)
Массив char var[10]; сам по себе является указателем, а потому его не надо разыменовывать и проч.
3)
char** var-двумерный указатель
Использовать можно так:
char** var= new char*[10]; 
for(int i=0;i<10;i++){
    var[i] = new char[10]; 
}
Ответ написан
Комментировать
dio4
@dio4
team leader, system engineer, master of sports
Меньше слов - больше кода )))
#include <stdio.h>
char * arr_char = "I am a 1";
typedef  char * type_p;
/* создаем указатель на указатель */
type_p * parr_char = &arr_char;

int main( int argc, char * argv[]){ 
// вывод строки через двойную **  
	while( **parr_char != '\0' ) {
		printf("%c", **parr_char);
		(*parr_char)++;
	}
	printf("\n"); 
// вывод строки через одинарную *  
	arr_char = &"I am a 1"[0];  // возвращаем указатель на начало строки
	//arr_char = "I am a 1";  // или так возвращаем указатель на начало строки
 //arr_char = arr_char - 8;  // или так на начальный размер strlen(arr_char)
	while( *arr_char != '\0' ) {
		printf("%c", *arr_char);
		arr_char++;
	}
	printf("\n"); 
	return 0;
}
/*
Linux alexander-Inspiron-3521 3.13.0-74-generic #118-Ubuntu SMP Thu Dec 17 22:52:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
имеем в консоли
./tmp_str
I am a 1
I am a 1

*/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы