powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на массив. ОБъявление, инициализация, использование.
16 сообщений из 16, страница 1 из 1
Указатель на массив. ОБъявление, инициализация, использование.
    #34893280
Max_Хацкер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Не могу разобраться с указателем на массив. Как правильно его объявить, инициализировать и использовать?

Вот это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <iostream>

using namespace std;

int main(int argc, char *argv[], char *envp[])
{
    int (*nums)[ 10 ]; //здесь как правильно инициализацию сделать?
    int i =  0 ;

    nums = new int[ 10 ];  //incompatible types in assignment of `int*' to `int[10]' 
                         //incompatible types in assignment of `int' to `int[10]'

    for (i ==  0 ; i <  10  ; i++)
    {
        *(nums+i) = i;   //здесь надеялся использовать  (*nums)[i]. 
        std::cout << *(nums+i) << ' ' << i << "\n";
        
        }
    delete[] nums;
    system("pause");
    return  0 ;

компилиться отказыватеся, хотя во многих книжках и на форуме подобное видел.
Вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <iostream>

using namespace std;

int main(int argc, char *argv[], char *envp[])
{
    int *nums;
    int i =  0 ;

    nums = new int[ 10 ];

    for (i ==  0 ; i <  10  ; i++)
    {
        *(nums+i) = i;
        std::cout << *(nums+i) << ' ' << i << "\n";
        
        }
    delete[] nums;
    system("pause");
    return  0 ;
}

работает, но хотелось бы разобраться с объявлением
Код: plaintext
1.
int (*nums)[ 10 ]; 
Помогите с синтаксисом?
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893345
Murash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
int *nums;
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893529
Max_Хацкер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если всетаки
Код: plaintext
1.
int (*nums)[ 10 ]
, то как присвоить значение?
Код: plaintext
1.
2.
3.
 nums = new int[ 10 ] //не хочет
 nums = new int(*)[ 10 ] //тоже не хочет (в каком-то посте видел)
 nums = new (*int)[ 10 ] // тоже не хочет
и как раскрывать такой указатель?
Код: plaintext
1.
2.
3.
  (*nums)[i]    //матерится
  nums(*)[i]   //матерится
 *nums[i]     // это вообще не правильно, т.к. у меня указатель на массив, а не массив указателей.
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893539
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
new возвращает int*, а не int[].

Зачем тебе это надо?
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893580
Max_Хацкер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как бы вопрос не на пустом месте вохник:
MSDN - C Language Reference - Pointer Declarations
int *pointers[10]; /* Declares an array of pointers */
int (*pointer)[10]; /* Declares a pointer to an array of 10 elements */

Или это все Microsoft Specific?
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893603
Murash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Max_Хацкерint (*nums)[10];


где ты тут видишь указатель на массив?
пробуй тогда так

авторint *nums = new int[10]
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893648
Max_Хацкер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Murash Max_Хацкерint (*nums)[10];


где ты тут видишь указатель на массив?
пробуй тогда так

авторint *nums = new int[10]

Согласно гуру MSDN (циата оттуда).
А предложеный вариант это тоже самое, что и
Код: plaintext
1.
2.
int *nums;
nums = new int[ 10 ];
только в краткой записи.
Не сомневаюсь, что это работает. :)
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893688
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    int (*nums)[ 10 ] = reinterpret_cast<int (*)[]>(new int[ 10 ]);

    for (int i =  0 ; i <  10  ; ++i)
    {
        *nums = i;
        std::cout << *nums[i] << ' ' << i << "\n";

    }

    delete[] nums;
    system("pause");
    return  0 ;
}
Борланд это компилит и даёт ожидаемый вариант. Думаю и микрософт справится не хуже.
1. new int[10] возвращает тип int*, поэтому надо явно привести к типу массива (можно и в стиле С)
2. *(nums + i) не тоже самое, что *nums [i]
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893697
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гад, сожрал скобки )))
Код: plaintext
 *(nums + i) не тоже самое, что *nums[i]
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893817
Max_Хацкер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    int (*nums)[ 10 ] = reinterpret_cast<int (*)[]>(new int[ 10 ]);

    for (int i =  0 ; i <  10  ; ++i)
    {
        *nums = i;
        std::cout << *nums[i] << ' ' << i << "\n";

    }

    delete[] nums;
    system("pause");
    return  0 ;
}
Борланд это компилит и даёт ожидаемый вариант. Думаю и микрософт справится не хуже.
1. new int[10] возвращает тип int*, поэтому надо явно привести к типу массива (можно и в стиле С)
2. *(nums + i) не тоже самое, что *nums [i]


Микрософт обломался :

Error 1 error C2440: 'initializing' : cannot convert from 'int (*)[]' to 'int (*)[10]'


Или где-то очепятка. :)

P.S. Сам пользуюсь DevC++.
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893823
Max_Хацкер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверил в VS2005. Это так, к слову.
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34893838
Max_Хацкер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychгад, сожрал скобки )))
Код: plaintext
 *(nums + i) не тоже самое, что *nums[i]


Это я в курсе. Просто один из вариантов заняться адресной арифметикой :). В простых случаях, типа моего примера, может и можно так сделать. Но лучше пущай компилер над этим заморачивается.
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34894312
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Max_Хацкер
Микрософт обломался :

Error 1 error C2440: 'initializing' : cannot convert from 'int (*)[]' to 'int (*)[10]'


Или где-то очепятка. :)

P.S. Сам пользуюсь DevC++.

Попробуй вставить [10] в реинтерпрет каст.
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34894438
Max_Хацкер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал. Таже фигня.

Нарыл хорошую книгу: Стивен Прата. Язык программирования С++ с нормальным, внятным описанием работы с динамическими массивами и указателями на них.

Всем большое спасибо за участие.
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34894672
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Max_Хацкер
...
Или где-то очепятка. :)


Copy/Paste опечаток не оставляет, в чём его и прелесть
...
Рейтинг: 0 / 0
Указатель на массив. ОБъявление, инициализация, использование.
    #34896635
VladimirP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
классический пример из хелповника по оператору new
char *str;
int i,j,n,m,**data;
n = 5;
m = 6;
try { // TEST FOR EXCEPTIONS.
str = new char[100];
data = new int*[m]; // STEP 1: SET UP THE ROWS.
for (int j = 0; j < m; j++)

data[j] = new int[n]; // STEP 2: SET UP THE COLUMNS
}
catch (...) { // ENTER THIS BLOCK ONLY IF bad_alloc IS THROWN.
// YOU COULD REQUEST OTHER ACTIONS BEFORE TERMINATING
//cout << "Could not allocate. Bye ...";
//исключительная операция при выделении памяти пиши что хочешь
//обработай сам
return;
}
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
data [j] = i + j; // ARBITRARY INITIALIZATION
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
sprintf( str,
"i = %d j = %d data[%d][%d] = %d",
i, j, i, j, data[j]);
ListBox1->Items->Add( str);
//я пишу в билдере ListBox1->Items->Add( str); замени на свой вывод на экран
}




//освобождение памяти
for (int i = 0; i < m; i++)
delete[] data; // STEP 1: DELETE THE COLUMNS

delete[] data; // STEP 2: DELETE THE ROWS
delete[] str;
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на массив. ОБъявление, инициализация, использование.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]