10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
1

Для разбирающихся в работе массивов и указателей

26.02.2013, 11:39. Показов 667. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Алоха!

Есть код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main(void)
{
    char *mass[] = {"Hello", "World"};
    char **p;
 
    p = mass;
 
    printf("%s %s\n", *p, *(p+1));   // Hello World
    printf("%c\n", **(p+1));         // W
 
    return 0;
}
И все работает прекрасно.
Но вот мы меняем пятую строчку на это:

C
1
char mass[2][6] = {"Hello", "World"};
И код становится "недееспособным". Вопрос: в чем разница между этими объявлениями:

C
1
2
char *mass[] = {"Hello", "World"};
char mass[2][6] = {"Hello", "World"};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2013, 11:39
Ответы с готовыми решениями:

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе...

Создание массивов указателей на массивы указателей
Помогите в решении задачи: создал массив указателей на массивы указателей на строки, но компилятор...

Указатели. Переписать программу для одномерных массивов с применением указателей
Составить программу нахождения произведения отрицательных (положительных) элементов массива

Составить программу на языке C++ для обработки двумерных массивов с использованием указателей
Дана матрица порядка n. Найти в последнем столбце max и min. Если в матрице есть нули, то заменить...

6
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,931
26.02.2013, 13:29 2
В первом случае массив указателей, а во втором - двумерный массив символов.

Добавлено через 6 минут
Во втором случае:
C
1
2
3
4
5
6
    char mass[2][6] = {"Hello", "World"};
    char *p;
    p= (char*)mass;
 
    printf("%s %s\n", p, p+6);   // Hello World
    printf("%c\n", *(p+6));         // W
1
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
26.02.2013, 15:18  [ТС] 3
alexcoder,
Я немного запутался.

Что значит "двумерный массив символов"? Ведь чтобы получать доступ к ячейкам этого самого двумерного массива, надо иметь массив указателей.

Разве объявляя следующее:
C
1
char mass[2][6];
мы не создаем указатель mass на массив указателей?

Можете объяснить подробно, что делает компилятор, когда встречает эти строки?
C
1
2
char *mass[] = {"Hello", "World"};
char mass[2][6] = {"Hello", "World"};
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12697 / 7529 / 1760
Регистрация: 25.07.2009
Сообщений: 13,854
26.02.2013, 15:25 4
Объявление
Цитата Сообщение от murtukov Посмотреть сообщение
char *mass[] = {"Hello", "World"};
строго говоря вообще не правильное. А по теме - может так нагляднее будет:
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(void) {
    const char * a[] = { "Hello", "World" };
    char b[2][6] = { "Hello", "World" };
    
    printf("%d %d\n", sizeof(a[0]), sizeof(b[0]));
    
    return 0;
}
1
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,931
26.02.2013, 15:30 5
Разве объявляя следующее:
char mass[2][6];
мы не создаем указатель mass на массив указателей?
нет

C
1
char *mass[] = {"Hello", "World"};
в памяти создается два указателя (адреса) на слова. Сами слова хранятся в произвольном месте программы.

C
1
char mass[2][6] = {"Hello", "World"};
в памяти создается такая последовательность байт:
'H','e','l','l','o','\0',
'W','o','r','l','d','\0'
1
4249 / 2945 / 688
Регистрация: 08.06.2007
Сообщений: 9,846
Записей в блоге: 4
26.02.2013, 15:31 6
1. Создает массив указателей (массив, значит оба указателя в памяти лежат рядом). Длина элемента массива 4. Создает два символьных массива и располагает в них слова с завершающим нулем. Массивы могут быть разной длины, хотя у нас они одинаковые. Указатели на эти массивы размещает в первом массиве. mass это указатель на первый элемент первого массива.
2. Создает область памяти для 2х6 символов, размещает в них последовательно слова, полагая, что под слово отводится ровно 6 символов. mass это указатель на первый элемент этого массива.

В первом случае mass+1 это добавление к указателю четырех. Во втором случае mass+1 это добавление к указателю шести.
1
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
26.02.2013, 16:15  [ТС] 7
Спасибо всем. Все стало ясно)
0
26.02.2013, 16:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2013, 16:15
Помогаю со студенческими работами здесь

Составить программу на языке C++ для обработки двумерных массивов с использованием указателей
Составить программу на языке C++ для обработки двумерных массивов с использованием указателей. ...

Использование указателей при работе с массивами
Здесь двумерный массив, теперь надо написать его с использованием указателей. У меня не...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...

Использование указателей при работе с одномерными массивами
Реализовать на Си. Даны натуральное число n, действительные числа a1,...,an. Если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru