Форум программистов, компьютерный форум CyberForum.ru

Указатель на массив char и прочее - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Даны вещественные массивы a[13] и k [13], для каждого массива определить... http://www.cyberforum.ru/cpp-beginners/thread351326.html
Даны вещественные массивы a и k , для каждого массива определить минимальный положительный элемент и средне гармоническое всех отрицательных элементво массива.
C++ вычислить сумму элементов,расположенных между максимальным и минимальным элементом вычислить сумму элементов,расположенных между максимальным и минимальным элементом (первыми по порядку, если их нескглько) Если вычислить сумму не удается, выдать сообщерие с указанием причины. http://www.cyberforum.ru/cpp-beginners/thread351318.html
C++ Русские буквы
Ребят всем привет!!! Подскажите мне пожалуйста такую вещь,хочу в С++ чтобы на русском выводилось,компилирую в Dev C++,у меня каляки маляки выходят,то есть в компиляторе например пишу "Привет" в командной строке вижу "оыаотд"
C++ Реализация класса
Так как только начал изучать с++, возникает вопрос: есть задание : Реализовать класс IntArray. Разработать тестовую программу для проверки работоспособности класса (т.е. необходимо убедиться в работоспособности всех конструкторов и операторов класса, а также всех его методов). Для этого достаточно делать распечатку массива после выполнения каждой операции, которая может изменять его...
C++ Linker error при компиляции http://www.cyberforum.ru/cpp-beginners/thread351257.html
У меня вылезает ошибка при компиляции: undefined reference to `gluPerspective@32' По сути он ругается на то что не может найти функцию gluPerspective, но в include я подключил #include <gl\glu.h>, в папке такой файл есть (даже открывал сам заголовочный файл и в нем все на месте), компилирую в dev c++, код брал отсюда...
C++ Разрушение объектов при наследовании Привожу код, вопрос после описания #include <iostream> using namespace std; class A { public: A() подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
14.09.2011, 14:03     Указатель на массив char и прочее
Цитата Сообщение от Evg Посмотреть сообщение
Тут фактически в "x" записывается адрес "b" + 72 байта
Гоню. Из b читается значение, к нему прибавляется 72 и результат записывается в "x". Потому как значение выражение b[3] номинально есть "массив из 6 элементов", а массив в правой части присваивания трактуется как адрес первого элемента. Это я просто поясняю, почему я изначально сделал неверный вывод - неправильно трактовал то, что написано в ассемблерном коде

Добавлено через 7 минут
Цитата Сообщение от kazak Посмотреть сообщение
Evg, так что же это получается, типа в языке не предусмотренно, но реально его можно получить?
Просто я не знаю, как это нормально словами объяснить. Просто "массив" и "массив из 6 элементов" - как бы разные вещи. Щас на примере попробую наваять

Добавлено через 19 минут
Я нагнал, когда писал "Указателя на массив как такового типа в языке нет". Имел в виду, что когда мы имеем указатель "int *p;", то с ним можно работать и как с указателем на скалярную переменную, обращаясь с ним типа "*p = 5;", и как с указателем на некую память, где лежит массив int'ов, и обращаться через "p[0] = 5; p[10] = 5;" и т.п. В этом отношении любая память, куда смотрит указатель, может трактоваться как массив, при этом нигде нет информации о том, какого размера этот массив. Да и вообще указатель может смотреть в середину массива:

C
1
2
3
4
int x[10];
int *p = &x[5];
p[-3] = 0; /* обращение в x[2]; */
p[2] = 0; /* обращение в x[7]; */
Когда через typedef вводится тип-массив, то это получается некая единая конструкция "массив из стольки-то элементов". Например, указатель на "массив из 6 int'ов" трактуется как указатель, смотрящий на массив, состоящий из 24-байтных элементов. И при индексации через такой указатель смещения будут работать в терминах 24-байтных элементов, а не в терминах 4-байтных элементов, как это происходило с указателем на int.

Понимаю, что объяснено сумбурно, но как-то затрудняюсь это внтяными словами пояснить

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
typedef int (arr6_t)[6];
 
void func (void)
{
  int arr6[6];
  int *ptr;
  arr6_t *arr6_ptr; /* указатель на массив */
 
  /* Просто имя массива в правой части трактуется как адрес первого
   * элемента массива, который фактически имеет тип int* */
  ptr = arr6;
 
  /* В правой части присваивания имеем r-выражение типа int* (см. выше),
   * а в левой - l-выражение типа "указатель на массив из 6 элементов".
   * Т.е. имеем присваивание между собой указателей разных типов, т.е.
   * конструкция некорректная. Хотя gcc, к примеру, такую конструкцию
   * съест, потому как он работает в своём расширении языка, а не в стандартном */
  arr6_ptr = arr6;
 
  /* R-выражение "&arr6" с точки зрения полученного кода ничем неотличается
   * от r-выражения "arr6", но "arr6" сточки зрения языка трактуется как
   * "&(arr6[0])" и имеет тип int*, а вот "&arr6" трактуется именно так,
   * как и написано (т.е. адрес на переменную, а не адрес на первый элемент),
   * и потому имеет тип "указатель на массив из 6 элементов" */
  arr6_ptr = &arr6;
}
В итоге "указатель на массив" в языке всё-таки есть, но вот с таким немного извращённым синтаксисом и непростым пониманием

Добавлено через 4 минуты
И ещё в догонку к коду:

C
1
2
3
4
5
6
7
8
9
10
  /* Исходя из предыдущих объяснений в правой части выражение имеет тип
   * "указатель на массив из 6 int'ов", а в левой - "указатель на int". Формально
   * такое присваивание не является корректным */
  ptr = &arr6;
 
  /* Тут всё корректно */
  ptr = &(arr6[0]);
 
  /* Тут некорректно */
  arr6_ptr = &(arr6[0]);
В итоге мы одно и тоже действие получили шестью способами. Все способы сгенерят один и тот же код (если кокнретное расширение языка это допускает). Но из-за трактовки языка, три из этих конструкций являются некорректными
 
Текущее время: 14:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru