Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052

Почему *arr И arr[] одинаковые, но в тоже время разные?

08.04.2017, 00:36. Показов 6528. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например есть какая-то ф-я:
C++
1
2
3
4
void temp(int &(*arr))
{
    // . . .
}
И 2 разных массива которые будем передавать ф-и:
C++
1
2
3
4
5
6
7
8
9
int main(void)
{
    int arr_one[15];
    int *arr_two = new int[15];
    temp(arr_two); // компилятор не ругается
    temp(arr_one); // компилятор ругается
    // Почему так? Ведь arr_two & arr_one массивы ?!
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2017, 00:36
Ответы с готовыми решениями:

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

Проблемы с методом массива (Array.prototype.p=1 var arr=new Array(); arr.watch('p',alertme) arr.p=2)
Опять я с подобной проблемой. <script language='JavaScript1.2'> function alertme(id,oldValue,newValue){ alert('arr.'+id+' =...

Напишите функцию filterRange(arr, a, b), которая принимает массив arr, ищет в нём элементы между a и b
Здравствуйте! Всех с прошедшими праздниками! Сегодня, пишу с целью задать несколько вопросов. У меня есть задачка: ...

21
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
08.04.2017, 00:54
Так у меня оба принял
C++
1
void temp(int *arr)
Добавлено через 1 минуту
Например
C++
1
2
3
4
5
6
7
8
9
void temp(int *arr)
{
    for (int i = 0; i < 15; i++)
    {
        arr[i] = i;
        cout << arr[i] << " ";
    }   
    cout << endl;
}
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
08.04.2017, 00:56  [ТС]
Hitoku, дело в том, что когда по ссылке нужно передать
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
08.04.2017, 00:58
anapshy, массивы и указатели это разные типы данных, просто первый элемент массива является указателем на его начало
1
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
08.04.2017, 01:05  [ТС]
Hitoku, упс.. немного в коде накосячил.
Вот при таком ругается.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
void temp(int *(&arr));
int main(void)
{
    int arr_one[15];
    int *arr_two = new int[15];
    temp(arr_two); // компилятор не ругается
    temp(arr_one); // компилятор ругается
                   // Почему так? Ведь arr_two & arr_one массивы ?!
    return 0;
}
 
void temp(int *(&arr))
{
    cout << "C++" << endl;
}
0
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
08.04.2017, 01:05
Лучший ответ Сообщение было отмечено anapshy как решение

Решение

anapshy, по ссылке только статический
C++
1
void temp(int (&arr)[15])
а так только динамический
C++
1
void temp(int *(&arr))
думаю, что с этим нужно просто смириться
1
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
08.04.2017, 01:15  [ТС]
obivan, где-то читал/слышал, что массив это тот же указатель; можно передавать в функцию так temp(char *arr){...}. Только не могу вспомнить где это слышал / читал... Скорее всего на YouTube

Добавлено через 2 минуты
Hitoku, даже и не знал, что так можно void temp(int (&arr)[15])
, спасибо

Добавлено через 2 минуты
Hitoku, данную проблему можно только перегрузкой функций исправить? Или есть какой-то более удобный способ?
0
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
08.04.2017, 01:17
anapshy, тут, увы, ничего не подскажу. В C++ совсем недавно
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2017, 01:25
Лучший ответ Сообщение было отмечено anapshy как решение

Решение

Цитата Сообщение от anapshy Посмотреть сообщение
где-то читал/слышал, что массив это тот же указатель;
Нет, просто имя массива, в некоторых случаях, разлагается (decay) до указателя на его первый элемент.

Добавлено через 7 минут
Цитата Сообщение от anapshy Посмотреть сообщение
C++
1
int *(&arr)
Скобки здесь зачем?
1
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
08.04.2017, 01:30  [ТС]
nd2, просто так мне удобней читать
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
08.04.2017, 01:33
Цитата Сообщение от anapshy Посмотреть сообщение
что массив это тот же указатель
нет, попробуйте http://en.cppreference.com/w/cpp/types/is_array и убедитесь сами.
Просто:
1 - часто под динамическим массивом подразумевают указатель, ссылающийся на динамический массив
2 - массив свободно приводится к указателю.
Если считаете, что массив и указатель одно и то же - попробуйте двумерный статический массив (например int arr[42][42]) передать в функцию, которая принимает тип "указатель на указатель" (например int**).

Добавлено через 46 секунд
Цитата Сообщение от anapshy Посмотреть сообщение
Ведь arr_two & arr_one массивы ?!
нет. Есть массив и указатель на динамический массив.

Добавлено через 1 минуту
Цитата Сообщение от obivan Посмотреть сообщение
первый элемент массива является указателем
нет, первый элемент массива является объектом, который храниться в массиве. Адрес первого элемента массива совпадает с адресом массива.
2
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2017, 01:33
Цитата Сообщение от anapshy Посмотреть сообщение
просто так мне удобней читать
И как ты это читаешь?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
08.04.2017, 01:35
Цитата Сообщение от anapshy Посмотреть сообщение
Скорее всего на YouTube
Тогда не удивительно. Тамошние учителя и не такого расскажут.

Добавлено через 44 секунды
Цитата Сообщение от anapshy Посмотреть сообщение
Или есть какой-то более удобный способ?
Принимать указатель (int*). Массив к указателю приводится без проблем.
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
08.04.2017, 01:40  [ТС]
MrGluck,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
void temp(int *(&arr));
int main(void)
{
    int arr_one[15], *arr_two = new int[15];
    temp(arr_two);
    temp((int*)arr_one); /// Error: невозможно преобразовать аргумент из "int*" в "int *&"
    return 0;
}
 
void temp(int *(&arr))
{
    cout << "C++" << endl;
}
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2017, 01:42
anapshy, как ты читаешь эту запись?
C++
1
int *(&arr)
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
08.04.2017, 02:01  [ТС]
nd2, указатель на какой-то адрес указателя?! типа как указатель на указатель.

Добавлено через 6 минут
адрес указателя крч можно взять.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
08.04.2017, 02:05
Лучший ответ Сообщение было отмечено anapshy как решение

Решение

anapshy,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
void temp(int *)
{
    std::cout << "C++" << std::endl;
}
 
int main(void)
{
    int arr_one[15], *arr_two = new int[15];
    temp(arr_two);
    temp(arr_one);
    delete[] arr_two;
}
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2017, 02:05
Цитата Сообщение от anapshy Посмотреть сообщение
ссылка на какой-то адрес?!
Ссылка на указатель.
Цитата Сообщение от anapshy Посмотреть сообщение
C++
1
temp((int*)arr_one);
Зачем приводить имя массива к указателю? Это автоматически делается при передаче массива в функцию. Если хочешь привести к ссылке на указатель:
C++
1
temp((int*&)arr_one);
1
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
08.04.2017, 02:24  [ТС]
nd2, MrGluck, Hitoku,
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
27
28
29
#include <iostream>
using namespace std;
void change(int *);
void print(int *);
int main(void)
{
    int arr_one[15]={0}, *arr_two = new int[15];
    print(arr_two);
 
    print(arr_one);
    change(arr_one);
    print(arr_one);
    
    delete[] arr_two;
    return 0;
}
 
void print(int *arr)
{
    for(size_t i = 0; i < 15; i++){
        cout << arr[i]<< " "; 
    }
    cout << endl;
}
 
void change(int *arr)
{
    arr[0] = 1;
}
Раз переданный массив в ф-ю изменяется, то как изменить его в change, чтоб он не изменился в main?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
08.04.2017, 02:33
anapshy, используйте std::array. Для стандартных массивов это не выйдет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.04.2017, 02:33
Помогаю со студенческими работами здесь

Почему работает и так, и так: arr[i] и i[arr]?
//один и тот же результат cout&lt;&lt;arr; cout&lt;&lt;i;//почему нет ошибки да даже это, например работает и выводит одинаковый результат ...

чем отличается *(arr+1) от *(arr++)?
подскажите пожалуйста в чем отличие между *(arr+1) и *(arr++), допустим char arr=&quot;qwertyuiop&quot;; while(*arr!='\0') { ...

Объявление массива int *arr почему так
Объявление массива int *arr почему так, а не int arr, что означает *

Объяснить почему sizeof(arr) всегда возвращает одно и то же значение
Начал изучать динамические массивы. Какое бы n я ни вводил, всегда создается массив из 4 элементов. Что я упустил? #include...

int *arr или int arr[10]
Подскажите, корректно ли использовать для объявления массива или строки int *arr; char *srt; Так же и некоторые переменные...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru