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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2018, 03:12   #1
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию Указатели на символьные строки.

Добрый день. Только начинает казаться, что понял указатели на символьные строки, как очередное упражнение ставит подножку.

Скриншот 2018-10-19 03_03_30.png

Пришлось это прочитать, наверное, больше 10 раз, чтобы вникнуть в задачу. И, если честно, до сих пор не уверен, что у меня это вышло.
Так или иначе, вот мой код.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void save_word (char ar[], int n);
int main (void)
{
        int words;
        char word[100];
        char * ptr[words]; // может (* ptr)[words], но тогда компилятор не пускает.
        printf("Сколько слов вы хотите ввести? ");
        scanf("%d", &words);
        while (getchar() != '\n')
                continue;
        printf("Теперь введите %d слов: \n", words);
        for (int j = 0; j < words; j++)
        {
                save_word (word, 100);
                *(ptr + j) = (char *) malloc ((strlen(word) + 1) * sizeof (char));
                for (int k = 0; k < strlen(word) + 1; k++)
                        *(*(ptr + j) + k) = word[k];
        }
        printf("Вот введенные вами слова\n");
        for (int j = 0; j < words; j++)
                printf("%s\n", *(ptr + j));
        for (int j = 0; j < words; j++)
                free(*(ptr + j));
        return 0;
}
void save_word (char ar[], int n)
{
        char ch;
        int i = 0;
        while ((ch = getchar()) != '\n' && ch != ' ' && i < n - 1)
        {
                ar[i] = ch;
                i++;
        }
        ar[i] = '\0';
}
Скорее всего тут есть ошибки и не по части указателей, поэтому, буду благодарен тем, кто наставит на путь истинный.
Спасибо.

Последний раз редактировалось Sinli; 19.10.2018 в 03:18.
Sinli вне форума Ответить с цитированием
Старый 19.10.2018, 06:53   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Sinli Посмотреть сообщение
char * ptr[words]; // может (* ptr)[words], но тогда компилятор не пускает.
Чему равно words здесь? Какого размера создатся массив?
p51x вне форума Ответить с цитированием
Старый 19.10.2018, 12:12   #3
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Как только объявил char * ptr[words] после получения значения переменной words, код заработал.
Код:
        int words;
        char word[100];
        printf("Сколько слов вы хотите ввести? ");
        scanf("%d", &words);
        char * ptr[words];
Но я почему-то думал, что, создавая массив переменной длины, я могу значение переменной потом указать.
Получается логика такая: не зная точного количества элементов, программа не может выделить правильно количество памяти?

И еще такой вопрос: отличаются ли такие объявления

char * ptr[n] и char (* ptr)[n] ?
Если да, то первым объявлением мы создаем массив из n указателей, а что же делает второе объявление? В книге я нашел вот такой отрывок:

Скриншот 2018-10-19 11_55_22.png

Правильно я понимаю, объявлением char (* ptr)[n] мы создаем ОДИН указатель, указывающий на массив из n элементов?
Но как это возможно, чтобы один указатель указывал на несколько элементов сразу? Ведь одному указателю - один адрес, разве нет?
И если создавать указатель на массив, то указатель получает адрес первого элемента массива.
Sinli вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Символьные строки C++ zusohegomi Помощь студентам 1 27.10.2015 19:59
Указатели, символьные строки и функции Vera_0709 Помощь студентам 0 28.12.2011 13:35
Символьные указатели prem1era Общие вопросы C/C++ 4 19.06.2011 08:56
Символьные строки. Си. meta Помощь студентам 2 24.05.2011 16:40
Указатели, символьные строки и функции dimit4 Общие вопросы C/C++ 1 15.01.2010 05:31