Re[2]: Инициализация указателя на массив
От: Vamp Россия  
Дата: 23.03.04 08:23
Оценка: +2
Лаптев! Не путайте товарища!
LVV>1. Имя массива и есть указатель.
ИМЯ МАССИВА НЕ ЕСТЬ УКАЗАТЕЛЬ.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 08:32
Оценка: -2
Здравствуйте, Vamp, Вы писали:

V>Лаптев! Не путайте товарища!

LVV>>1. Имя массива и есть указатель.
V>ИМЯ МАССИВА НЕ ЕСТЬ УКАЗАТЕЛЬ.
Есть! Только константа-указатель.
Именно поэтому можно писать присваивание для массива без всяких операций взятия адреса.
А также при передаче параметра в функцию имя массива на месте параметра-указателя пишется без всяких амперсандов.
Еще у Кернигана и Ричи написано.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Инициализация указателя на массив
От: dupamid Россия  
Дата: 23.03.04 10:00
Оценка: 8 (1)
Здравствуйте, Lorenzo_LAMAS, Вы писали:

D>>Если я правильно понял, что именно тебе нужно, то в С++ пока никак, а вот в С99 можно:


L_L>А что, могут такое добавить? Какой-нибудь proposal есть?


У рабочих групп WG14 и WG21 есть стремление опять свести вместе С и С++, особенно в тех местах где нет причин расходиться, так что можно надеятся. Вот ссылка не совсем про это, но там есть отдельный подраздел про составные литералы как в С99 http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1511.pdf.
Re[9]: Инициализация указателя на массив
От: dupamid Россия  
Дата: 23.03.04 08:54
Оценка: 3 (1)
Здравствуйте, Анатолий Широков, Вы писали:

АШ>А чем принципиально отличается в коде использование bbb определенной как int *bbb = (int[]){1, 2, 3, 4}; от int bbb[] = {1, 2, 3, 4};?


Мало чем, но можно не заводить переменную:
#include <stdio.h>

void f(int* p)
{
    while(*p) printf("%d\n", *p++);
}

int main()
{
    f((int[]){ 1, 2, 3, 0 });

    return 0;
}
Re[7]: Инициализация указателя на массив
От: lsv  
Дата: 23.03.04 08:50
Оценка: 1 (1)
Все предлогают вариант вида:
int aaa[] = {1,2,4};
int *bbb = aaa;
но для строк мы пишем: char *bbb = "xxx";
где вы здесь видете переменную ааа ...
Re[3]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 08:33
Оценка: -1
Здравствуйте, Анатолий Широков, Вы писали:

LVV>>1. Имя массива и есть указатель.


АШ>Массив приводится к указателю на первый элемент, но это суть две разные сущности.

Мы говорим не о массиве, а об имени массива. Так же как имя функции есть константа — указатель на функцию. Именно поэтому без операций взятия адреса можно имя массива использовать — еще у кернигана и ричи написано было.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Инициализация указателя на массив
От: dupamid Россия  
Дата: 23.03.04 08:48
Оценка: +1
Здравствуйте, lsv, Вы писали:

lsv>Мне нужно что-то типа:

lsv>int *ccc = (int[]){1,2,4};
lsv>но это не работает.
lsv>Как написать чтоб работало?

Почему это у тебя не работает? Может быть у тебя компилятор, который не поддрживает С99 (MS Visual C++ его пока не поддерживает (а может быть и никогда не будет)). Можешь попробовать использовать Intel C/C++, для C99 опция /Qc99 для Windows.
Re[7]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 09:22
Оценка: -1
Здравствуйте, Анатолий Широков, Вы писали:

LVV>>Имя массиа — это адрес его первого элемента, а адрес — это константа-указатель.


АШ>
АШ>int arr[] = {1, 2, 3, 4};
АШ>std::cout << sizeof(arr);
АШ>


АШ>По прежнему будете утвержать, что имя массива трактуется компилятором как адрес его первого элемента?

АШ>Если бы это было так, то sizeof(arr) == sizeof(int*).
Что пардон, то пардон! Все правильно.
LVV>>Так как массив — это не полноценный тип

АШ>Массив полноценный тип определенный в 8.3.4

Полноценный тип я могу передавать и возвращать по значению, и по ссылке, и по указателю.
И только для массива возникают исключения — по значению не могу — только по указателю или по ссылке.
Тут я со стандартом не согласен — нечего исключения городить — только начинающий народ запутывают. Получается так: пока мы не связываемся с передачей массива в функцию — все прекрасно мужики! Массив — это массив, он имеет количество элементов, размет и так далее. НО.... как только мы его передаем в функцию — тут у компилятора срочно развивается склероз, он всю эту информацию почему-то забывает и передает в функцию только адрес первого элемента.
Крупная неувязочка! Хотя понятно почему и приходится с этим мириться.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[8]: Инициализация указателя на массив
От: jazzer Россия Skype: enerjazzer
Дата: 23.03.04 09:38
Оценка: +1
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, jazzer, Вы писали:


J>>предлагаю помедитировать над следующим кодом

J>>
J>>typedef int Arr[5];

J>>void f(Arr& x);

J>>int main()
J>>{
J>>   int arr5[5];
J>>   int arr6[6];

J>>   f(arr5);
J>>   f(arr6);
J>>};
J>>

LVV>На компиляторе не проверял, но должна быть ошибка трансляции на второй функции.
LVV>Передача массива по ссылке — нормально. Ну и что?
LVV>Имеется ввиду, что выполняется контроль типов и "массив другого типа" компилятор не пропускает.
LVV>К вопросу о полноценности типа массива. Yes?

No.

Твои слова "Имя массива — это адрес его первого элемента" означают, что тип как arr5, так и arr6 — int*, соответственно, ни один вызов не должен скомпилироваться.

Так что суть именно в приведениях типа — я тебе только что продемонстрировал случай, когда оно не происходит и используется явный тип массива.
А когда оба эти массива можно передать в функцию, принимающую указатель на int — здесь как раз происходит приведение типа от массива к указателю.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Инициализация указателя на массив
От: Аноним  
Дата: 23.03.04 09:41
Оценка: :)
Здравствуйте, LaptevVV, Вы писали:

LVV>Это про Кернигана и Ричи?


Да нет, это про Вас. Я уверен, что K&R понимают разницу между именем массива и указателем на первый элемент этого массива.
Re[6]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 21.10.08 11:02
Оценка: -1
Здравствуйте, DarthVader, Вы писали:


DV>Тема старая конечно, но попробую задать вопрос здесь.

DV>есть указатель на массив int (*a)[1]
DV>нужно записать к нему new, не прибегая к помощи typedef
DV>/*
DV>typedef int IntArray[5]; //так работает
DV>IntArray *arr = new IntArray[1];
DV>*/

DV>а как записать, чтобы работало так: int (*a)[1] = new .......?

С преобразованием типа
int (*pp)[1] = (int (*)[1]) new int[1];
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Инициализация указателя на массив
От: lsv  
Дата: 23.03.04 08:17
Оценка:
Пример: char *aaa = "bbb";
В этом случае переменная ааа будет содержать указатель на строку "bbb".
Как тоже самое проделать с массивом чисел?
Есть массив: 1,2,3,4 и переменная int *bbb, как вот ей присвоить указатель на этот массив?
Re: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 08:22
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>Пример: char *aaa = "bbb";

lsv>В этом случае переменная ааа будет содержать указатель на строку "bbb".
lsv>Как тоже самое проделать с массивом чисел?
lsv>Есть массив: 1,2,3,4 и переменная int *bbb, как вот ей присвоить указатель на этот массив?
1. Имя массива и есть указатель.
2.

int a[4] = {1,2,3,4};
int *b1 = a;       //1
int *b2 = &a[0];   //2
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Инициализация указателя на массив
От: Vamp Россия  
Дата: 23.03.04 08:22
Оценка:
Если я правильно понял, то например, так:

int barr[]={1, 2, 3, 4};
int* bbb=&barr[0];


lsv>... указатель на этот массив?

А вообще-то, указатель на массив — это &barr. Но подозреваю, он тебе не нужен.
Да здравствует мыло душистое и веревка пушистая.
Re: Инициализация указателя на массив
От: Анатолий Широков СССР  
Дата: 23.03.04 08:25
Оценка:
int bbb[] = {1, 2, 3, 4};

// обход элементов
for(size_t i = 0; i < sizeof(bbb)/sizeof(bbb[0]); i++)
{
    int test = bbb[i];
}
Re[2]: Инициализация указателя на массив
От: Анатолий Широков СССР  
Дата: 23.03.04 08:28
Оценка:
LVV>1. Имя массива и есть указатель.

Массив приводится к указателю на первый элемент, но это суть две разные сущности.
Re: Инициализация указателя на массив
От: dupamid Россия  
Дата: 23.03.04 08:29
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>Пример: char *aaa = "bbb";

lsv>В этом случае переменная ааа будет содержать указатель на строку "bbb".
lsv>Как тоже самое проделать с массивом чисел?
lsv>Есть массив: 1,2,3,4 и переменная int *bbb, как вот ей присвоить указатель на этот массив?

Если я правильно понял, что именно тебе нужно, то в С++ пока никак, а вот в С99 можно:
#include <stdio.h>

int main()
{
    int* p = (int[]){ 1, 2, 3, 0 };

    while(*p) printf("%d\n", *p++);

    return 0;
}
Re[3]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 08:35
Оценка:
Имя — это не сущность. Имя — это использование идентификатора.
Of course, the code must be complete enough to compile and link.
Re[4]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 08:36
Оценка:
АШ>>Массив приводится к указателю на первый элемент, но это суть две разные сущности.
LVV>Мы говорим не о массиве, а об имени массива. Так же как имя функции есть константа — указатель на функцию. Именно поэтому без операций взятия адреса можно имя массива использовать — еще у кернигана и ричи написано было.


Имя массива — это имя массива, а не указатель. Есть стандартное преобразование array to pointer и есть ряд выражений, в которых оно применяется. Наш случай — один из таких.
Of course, the code must be complete enough to compile and link.
Re[4]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 08:39
Оценка:
LVV>Именно поэтому можно писать присваивание для массива без всяких операций взятия адреса.
LVV>А также при передаче параметра в функцию имя массива на месте параметра-указателя пишется без всяких амперсандов.

Потому, что если Вы напишете с & -то получите адрес массива, т.е. rvalue типа int (*)[размер]

LVV>Еще у Кернигана и Ричи написано.


Страницу, абзац, строку оригинала. А еще проще, раз уж так на С потянуло, стандарт C99 поглядеть
Of course, the code must be complete enough to compile and link.
Re[3]: Инициализация указателя на массив
От: lsv  
Дата: 23.03.04 08:39
Оценка:
Мне нужно что-то типа:
int *ccc = (int[]){1,2,4};
но это не работает.
Как написать чтоб работало?
Re[4]: Инициализация указателя на массив
От: Анатолий Широков СССР  
Дата: 23.03.04 08:40
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Анатолий Широков, Вы писали:


LVV>>>1. Имя массива и есть указатель.


АШ>>Массив приводится к указателю на первый элемент, но это суть две разные сущности.

LVV>Мы говорим не о массиве, а об имени массива. Так же как имя функции есть константа — указатель на функцию. Именно поэтому без операций взятия адреса можно имя массива использовать — еще у кернигана и ричи написано было.

Причем здесь имя? Адрес функции и адрес массива — константы. А вот о допустимых приведениях — 4 в общем, и 4.2, 4.3 в частности — именно благодаря этому мы может использовать конструкции типа:

int arr[] = {1, 2, 3, 4};
int *ptr = arr;
Re[4]: Инициализация указателя на массив
От: Анатолий Широков СССР  
Дата: 23.03.04 08:43
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Имя — это не сущность. Имя — это использование идентификатора.


Я говорил о массиве и указателе.
Re[5]: Инициализация указателя на массив
От: lsv  
Дата: 23.03.04 08:44
Оценка:
ДАЛОЙ ЛИШНИЕ ПЕРЕМЕННЫЕ. (Автор вопроса).
Re[4]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 08:44
Оценка:
Если ты пишешь на С99 и у тебя хороший компилятор, то должно работать. Комо онлайн скомпилировал.
Of course, the code must be complete enough to compile and link.
Re[6]: Инициализация указателя на массив
От: Анатолий Широков СССР  
Дата: 23.03.04 08:45
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>ДАЛОЙ ЛИШНИЕ ПЕРЕМЕННЫЕ. (Автор вопроса).


Объяснитесь.
Re[5]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 08:46
Оценка:
ок
Of course, the code must be complete enough to compile and link.
Re[7]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 08:47
Оценка:
АШ>Объяснитесь.

Ему нужен аналог строкового литерала, только это составной целый литерал. В С99 такое возможно.
Of course, the code must be complete enough to compile and link.
Re[8]: Инициализация указателя на массив
От: Анатолий Широков СССР  
Дата: 23.03.04 08:51
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

АШ>>Объяснитесь.


L_L>Ему нужен аналог строкового литерала, только это составной целый литерал. В С99 такое возможно.


А чем принципиально отличается в коде использование bbb определенной как int *bbb = (int[]){1, 2, 3, 4}; от int bbb[] = {1, 2, 3, 4};?
Re[8]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 08:52
Оценка:
lsv>но для строк мы пишем: char *bbb = "xxx";
lsv>где вы здесь видете переменную ааа ...

Смотри выше мой ответ и ответ dupamid
Of course, the code must be complete enough to compile and link.
Re[9]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 08:53
Оценка:
Вопрос не ко мне, а к lsv.
Of course, the code must be complete enough to compile and link.
Re[8]: Инициализация указателя на массив
От: Анатолий Широков СССР  
Дата: 23.03.04 08:55
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>Все предлогают вариант вида:

lsv>int aaa[] = {1,2,4};
lsv>int *bbb = aaa;
lsv>но для строк мы пишем: char *bbb = "xxx";
lsv>где вы здесь видете переменную ааа ...

А как вы будете использовать этот указатель? Может статься так, что и не потребуется никакой второй переменной. Например: http://www.rsdn.ru/Forum/Message.aspx?mid=578681&amp;only=1
Автор: Анатолий Широков
Дата: 23.03.04
.
Re[4]: Инициализация указателя на массив
От: jazzer Россия Skype: enerjazzer
Дата: 23.03.04 09:00
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Анатолий Широков, Вы писали:


LVV>>>1. Имя массива и есть указатель.


АШ>>Массив приводится к указателю на первый элемент, но это суть две разные сущности.

LVV>Мы говорим не о массиве, а об имени массива. Так же как имя функции есть константа — указатель на функцию. Именно поэтому без операций взятия адреса можно имя массива использовать — еще у кернигана и ричи написано было.

Все неправильно, кроме последнего предложения.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 09:02
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Причем здесь имя? Адрес функции и адрес массива — константы. А вот о допустимых приведениях — 4 в общем, и 4.2, 4.3 в частности — именно благодаря этому мы может использовать конструкции типа:

Имя массиа — это адрес его первого элемента, а адрес — это константа-указатель.
Ну, ИМХО в данном случае приведения только запутывают вопрос для новичка.
Так как массив — это не полноценный тип (его НЕЛЬЗЯ передать по значению, передается только адрес), то говорить здесь о приведениях ИМХО излишне. Я знаю, что в стандарте все это прописано. Но впечатление от этого у меня лично остается такое, что это добавлено для "полноты картины". Так ка ФАКТИЧЕКИ НИКАКОГО приведения в компиляторе не делается. Если б я писал — я именно так и сделал бы.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Инициализация указателя на массив
От: Аноним  
Дата: 23.03.04 09:07
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Vamp, Вы писали:


V>>Лаптев! Не путайте товарища!

LVV>>>1. Имя массива и есть указатель.
V>>ИМЯ МАССИВА НЕ ЕСТЬ УКАЗАТЕЛЬ.
LVV>Есть! Только константа-указатель.

Надеюсь, вы преподаете не С не C++.
Re[6]: Инициализация указателя на массив
От: Анатолий Широков СССР  
Дата: 23.03.04 09:09
Оценка:
LVV>Имя массиа — это адрес его первого элемента, а адрес — это константа-указатель.

int arr[] = {1, 2, 3, 4};
std::cout << sizeof(arr);


По прежнему будете утвержать, что имя массива трактуется компилятором как адрес его первого элемента?
Если бы это было так, то sizeof(arr) == sizeof(int*).

LVV>Так как массив — это не полноценный тип


Массив полноценный тип определенный в 8.3.4
Re[5]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 09:09
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LVV>>Именно поэтому можно писать присваивание для массива без всяких операций взятия адреса.

LVV>>А также при передаче параметра в функцию имя массива на месте параметра-указателя пишется без всяких амперсандов.

L_L>Потому, что если Вы напишете с & -то получите адрес массива, т.е. rvalue типа int (*)[размер]


LVV>>Еще у Кернигана и Ричи написано.


L_L>Страницу, абзац, строку оригинала. А еще проще, раз уж так на С потянуло, стандарт C99 поглядеть

Поищу.
Но приведения для массива — это фикция, которую включили в стандарт для "полноты" картины. Так как массив нельзя передать по значению, то говорить здесь о приведении типов — несколько не понятно. Имя массива — это адрес его первого элемента, а адрес — это константа-указатель. О каких преобразованиях, пусть даже и прописанных в стандарте. здесь может идти речь? В компиляторе-то реально ничего не преобразовывается.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 09:15
Оценка:
Здравствуйте, jazzer, Вы писали:

LVV>>>>1. Имя массива и есть указатель.


АШ>>>Массив приводится к указателю на первый элемент, но это суть две разные сущности.

LVV>>Мы говорим не о массиве, а об имени массива. Так же как имя функции есть константа — указатель на функцию. Именно поэтому без операций взятия адреса можно имя массива использовать — еще у кернигана и ричи написано было.

J>Все неправильно, кроме последнего предложения.

Это про Кернигана и Ричи?
Спасибо.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: Инициализация указателя на массив
От: jazzer Россия Skype: enerjazzer
Дата: 23.03.04 09:23
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Lorenzo_LAMAS, Вы писали:


LVV>>>Именно поэтому можно писать присваивание для массива без всяких операций взятия адреса.

LVV>>>А также при передаче параметра в функцию имя массива на месте параметра-указателя пишется без всяких амперсандов.

L_L>>Потому, что если Вы напишете с & -то получите адрес массива, т.е. rvalue типа int (*)[размер]


LVV>>>Еще у Кернигана и Ричи написано.


L_L>>Страницу, абзац, строку оригинала. А еще проще, раз уж так на С потянуло, стандарт C99 поглядеть

LVV>Поищу.
LVV>Но приведения для массива — это фикция, которую включили в стандарт для "полноты" картины. Так как массив нельзя передать по значению, то говорить здесь о приведении типов — несколько не понятно. Имя массива — это адрес его первого элемента, а адрес — это константа-указатель. О каких преобразованиях, пусть даже и прописанных в стандарте. здесь может идти речь? В компиляторе-то реально ничего не преобразовывается.

предлагаю помедитировать над следующим кодом
typedef int Arr[5];

void f(Arr& x);

int main()
{
   int arr5[5];
   int arr6[6];

   f(arr5);
   f(arr6);
};
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[7]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 09:28
Оценка:
Здравствуйте, jazzer, Вы писали:

J>предлагаю помедитировать над следующим кодом

J>
J>typedef int Arr[5];

J>void f(Arr& x);

J>int main()
J>{
J>   int arr5[5];
J>   int arr6[6];

J>   f(arr5);
J>   f(arr6);
J>};
J>

На компиляторе не проверял, но должна быть ошибка трансляции на второй функции.
Передача массива по ссылке — нормально. Ну и что?
Имеется ввиду, что выполняется контроль типов и "массив другого типа" компилятор не пропускает.
К вопросу о полноценности типа массива. Yes?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 09:33
Оценка:
D>Если я правильно понял, что именно тебе нужно, то в С++ пока никак, а вот в С99 можно:

А что, могут такое добавить? Какой-нибудь proposal есть?
Of course, the code must be complete enough to compile and link.
Re[5]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 09:38
Оценка:
Здравствуйте, Аноним, Вы писали:

V>>>Лаптев! Не путайте товарища!

LVV>>>>1. Имя массива и есть указатель.
V>>>ИМЯ МАССИВА НЕ ЕСТЬ УКАЗАТЕЛЬ.
LVV>>Есть! Только константа-указатель.

А>Надеюсь, вы преподаете не С не C++.

А вы сами преподавали?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[9]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 09:43
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Твои слова "Имя массива — это адрес его первого элемента" означают, что тип как arr5, так и arr6 — int*, соответственно, ни один вызов не должен скомпилироваться.


J>Так что суть именно в приведениях типа — я тебе только что продемонстрировал случай, когда оно не происходит и используется явный тип массива.

J>А когда оба эти массива можно передать в функцию, принимающую указатель на int — здесь как раз происходит приведение типа от массива к указателю.
ок.
Но

void f(int x[5]);

J>int main()
J>{
J>   int arr5[5];
J>   int arr6[6];

J>   f(arr5);
J>   f(arr6);
J>};

Куда происходит преобразование?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[8]: Инициализация указателя на массив
От: jazzer Россия Skype: enerjazzer
Дата: 23.03.04 09:43
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Анатолий Широков, Вы писали:


LVV>>>Имя массиа — это адрес его первого элемента, а адрес — это константа-указатель.


АШ>>
АШ>>int arr[] = {1, 2, 3, 4};
АШ>>std::cout << sizeof(arr);
АШ>>


АШ>>По прежнему будете утвержать, что имя массива трактуется компилятором как адрес его первого элемента?

АШ>>Если бы это было так, то sizeof(arr) == sizeof(int*).
LVV>Что пардон, то пардон! Все правильно.
LVV>>>Так как массив — это не полноценный тип

АШ>>Массив полноценный тип определенный в 8.3.4

LVV>Полноценный тип я могу передавать и возвращать по значению, и по ссылке, и по указателю.
LVV>И только для массива возникают исключения — по значению не могу — только по указателю или по ссылке.
LVV>Тут я со стандартом не согласен — нечего исключения городить — только начинающий народ запутывают. Получается так: пока мы не связываемся с передачей массива в функцию — все прекрасно мужики! Массив — это массив, он имеет количество элементов, размет и так далее. НО.... как только мы его передаем в функцию — тут у компилятора срочно развивается склероз, он всю эту информацию почему-то забывает и передает в функцию только адрес первого элемента.
LVV>Крупная неувязочка! Хотя понятно почему и приходится с этим мириться.

см. мое сообщение про ссылки и не путай больше своих студентов.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[9]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 09:45
Оценка:
Здравствуйте, jazzer, Вы писали:

J>см. мое сообщение про ссылки и не путай больше своих студентов.

Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[10]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 09:48
Оценка:
LVV>Куда происходит преобразование?

Из массива из пяти целых в указатель на первый элемент массива.

arr5 — имя, обозначающее объект — массив из пяти целых, типа объекта — массив из 5 целых.
Of course, the code must be complete enough to compile and link.
Re[11]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 09:53
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LVV>>Куда происходит преобразование?


L_L>Из массива из пяти целых в указатель на первый элемент массива.

Ну вот, и я о том же.
L_L>arr5 — имя, обозначающее объект — массив из пяти целых, типа объекта — массив из 5 целых.
ок.
Что ж за неделяы такая — облом за обломом!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[12]: Инициализация указателя на массив
От: jazzer Россия Skype: enerjazzer
Дата: 23.03.04 10:03
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Lorenzo_LAMAS, Вы писали:


LVV>>>Куда происходит преобразование?


L_L>>Из массива из пяти целых в указатель на первый элемент массива.

LVV>Ну вот, и я о том же.

совсем не о том.
Мы о преобразованиях к типу указателя, которые могут быть, а могут и не быть, а ты — об эквивалентноти имени и указателя.

L_L>>arr5 — имя, обозначающее объект — массив из пяти целых, типа объекта — массив из 5 целых.

LVV>ок.
LVV>Что ж за неделяы такая — облом за обломом!

Пора в отпуск, вестимо
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[12]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 10:24
Оценка:
LVV>Что ж за неделяы такая — облом за обломом!

Так ведь весна началась!
Of course, the code must be complete enough to compile and link.
Re[13]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 10:26
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LVV>>Что ж за неделяы такая — облом за обломом!


L_L>Так ведь весна началась!

А, блин! АВИТАМИНОЗ!!!!
Спасибо, теперь хоть не так переживать буду — пройдет!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[13]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 10:30
Оценка:
Здравствуйте, jazzer, Вы писали:

LVV>>Что ж за неделяы такая — облом за обломом!


J>Пора в отпуск, вестимо

Ох, года на два — от учебного процесса!
Сидеть дома и писать докторскую , обсуждать с аспирантами их диссеры — и чтоб в институте про меня ЗАБЫЛИ!!!!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[7]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 10:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, LaptevVV, Вы писали:


LVV>>Это про Кернигана и Ричи?


А>Да нет, это про Вас. Я уверен, что K&R понимают разницу между именем массива и указателем на первый элемент этого массива.

Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: Инициализация указателя на массив
От: Аноним  
Дата: 23.03.04 11:11
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>А вы сами преподавали?


Нет, не преподавал. Я считаю, что для того чтобы преподавать что-то, нужно этот предмет знать ОЧЕНЬ хорошо. У меня нет проблем с такими базовыми вещами С, как указатели и массивы, но я не считаю, что знаю его настолько хорошо, чтобы идти преподавать.
Re[9]: Инициализация указателя на массив
От: Аноним  
Дата: 23.03.04 14:42
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Здравствуйте, Lorenzo_LAMAS, Вы писали:


АШ>>>Объяснитесь.


L_L>>Ему нужен аналог строкового литерала, только это составной целый литерал. В С99 такое возможно.


АШ>А чем принципиально отличается в коде использование bbb определенной как int *bbb = (int[]){1, 2, 3, 4}; от int bbb[] = {1, 2, 3, 4};?


А что, правда не отличается?

int bbb[] = {1, 2, 3, 4};
С тем, что это инициализация массива и всё законно, думаю все согласятся.


int *bbb = (int[]){1, 2, 3, 4};
А что это?
Инициализация указателя адресом временной переменной?
Я понимаю, что хочется, но можно ли?
Re[10]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 23.03.04 14:54
Оценка:
А>int *bbb = (int[]){1, 2, 3, 4};
А>А что это?
А>Инициализация указателя адресом временной переменной?
А>Я понимаю, что хочется, но можно ли?

В С99 можно. Об этом тут сказали раз 10
Of course, the code must be complete enough to compile and link.
Re[7]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 23.03.04 14:54
Оценка:
Здравствуйте, Аноним, Вы писали:

LVV>>А вы сами преподавали?


А>Нет, не преподавал. Я считаю, что для того чтобы преподавать что-то, нужно этот предмет знать ОЧЕНЬ хорошо. У меня нет проблем с такими базовыми вещами С, как указатели и массивы, но я не считаю, что знаю его настолько хорошо, чтобы идти преподавать.

Знание предмета — это прекрасно. Но еще важнее, КОМУ приходится преподавать. Контингент может быть (и очень часто) таков, что придется упрощать, иначе повыгонешь весь поток. Вот проблема!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Инициализация указателя на массив
От: McSeem2 США http://www.antigrain.com
Дата: 23.03.04 19:15
Оценка:
V>>Лаптев! Не путайте товарища!
LVV>>>1. Имя массива и есть указатель.
V>>ИМЯ МАССИВА НЕ ЕСТЬ УКАЗАТЕЛЬ.
LVV>Есть! Только константа-указатель.

Нет, это не "константа-указатель". И не указатель вовсе. Это адрес. Повторять каждое утро. Адрес. По определению адрес — это число, в данном случае — константа. А указатель — это переменная, значением которой является адрес. В случае с именем массива никакой переменной нет и быть не может.

Такие дела.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[11]: Инициализация указателя на массив
От: Аноним  
Дата: 24.03.04 10:36
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

А>>int *bbb = (int[]){1, 2, 3, 4};

А>>А что это?
А>>Инициализация указателя адресом временной переменной?
А>>Я понимаю, что хочется, но можно ли?

L_L>В С99 можно. Об этом тут сказали раз 10


А может просветите, что это будет означать?
Когда инициализируется массив, там понятно, куда лягут инициализаторы, для них есть место.
А здесь что? будет создан временный массив? А долго он будет жить?
Re[12]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 24.03.04 10:44
Оценка:
А>А может просветите, что это будет означать?
А>Когда инициализируется массив, там понятно, куда лягут инициализаторы, для них есть место.
А>А здесь что? будет создан временный массив? А долго он будет жить?

К сожалению, могу только гадать — не знаю С99, а стандарта под рукой в данный момент нет. Если не прав, надеюсь, поправят. Итак, по-моему, такой "литерал" будет аналогом строкового литерала, являться статическим объектом и обладать static storage duration.
Of course, the code must be complete enough to compile and link.
Re[13]: Инициализация указателя на массив
От: Kluev  
Дата: 24.03.04 13:18
Оценка:
То что имя масива не есть указатель это факт ибо можно так:

template <size_t N, class T>
size_t len_of( T (&arr)[N] ) {
    return N;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int x[] = { 1,2,3 };
    int sz = len_of( x ); // sz = 3

    return 0;
}
Re[14]: Инициализация указателя на массив
От: Lorenzo_LAMAS  
Дата: 24.03.04 13:29
Оценка:
Хочу Вас поравдовать, в С99 о котором (и о стандарте которого) говорили, template является идентификатором, а Ваша программа не скомпилируется.
Of course, the code must be complete enough to compile and link.
Re[5]: Инициализация указателя на массив
От: DarthVader Украина  
Дата: 20.10.08 17:42
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LVV>>Именно поэтому можно писать присваивание для массива без всяких операций взятия адреса.

LVV>>А также при передаче параметра в функцию имя массива на месте параметра-указателя пишется без всяких амперсандов.

L_L>Потому, что если Вы напишете с & -то получите адрес массива, т.е. rvalue типа int (*)[размер]


LVV>>Еще у Кернигана и Ричи написано.


L_L>Страницу, абзац, строку оригинала. А еще проще, раз уж так на С потянуло, стандарт C99 поглядеть



Тема старая конечно, но попробую задать вопрос здесь.

есть указатель на массив int (*a)[1]

нужно записать к нему new, не прибегая к помощи typedef
/*
typedef int IntArray[5]; //так работает
IntArray *arr = new IntArray[1];
*/

а как записать, чтобы работало так: int (*a)[1] = new .......?
И грязные дела дают чистую прибыль.
Re[7]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 22.10.08 06:18
Оценка:
Здравствуйте, LaptevVV, Вы писали:

DV>>а как записать, чтобы работало так: int (*a)[1] = new .......?

LVV>С преобразованием типа
LVV>
LVV>int (*pp)[1] = (int (*)[1]) new int[1];
LVV>

Не согласен — предлагай!
Напишите, как правильно, пожалуйста.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[8]: Инициализация указателя на массив
От: DarthVader Украина  
Дата: 22.10.08 08:18
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, LaptevVV, Вы писали:


DV>>>а как записать, чтобы работало так: int (*a)[1] = new .......?

LVV>>С преобразованием типа
LVV>>
LVV>>int (*pp)[1] = (int (*)[1]) new int[1];
LVV>>

LVV>Не согласен — предлагай!
LVV>Напишите, как правильно, пожалуйста.


Уже разобрался, спасибо.

Кроме того, тут на форуме прямо оказалась рядом темка, что называется "в тему" =)
http://www.rsdn.ru/Forum/message/2544612.flat.aspx
Автор:
Дата: 13.06.07
И грязные дела дают чистую прибыль.
Re[8]: Инициализация указателя на массив
От: Erop Россия  
Дата: 22.10.08 08:43
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Не согласен — предлагай!

если не понятно, то я не согласен, что массив из одного int можно безнаказанно приводить к указателю на что бы то ни было. Указатель легко может оказаться больше, чем int...

Если уж тебе охота хаккерить именно так, то надо действовать в следующем духе:
reinterpret_cast<XXX_type>( new char[sizeof(XXX_type)])
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Инициализация указателя на массив
От: LaptevVV Россия  
Дата: 22.10.08 10:13
Оценка:
Здравствуйте, Erop, Вы писали:

LVV>>Не согласен — предлагай!

E>если не понятно, то я не согласен, что массив из одного int можно безнаказанно приводить к указателю на что бы то ни было. Указатель легко может оказаться больше, чем int...
Эт понятно. Дело не в хакерстве. А втом, что до меня не дошло, как правильно.
Наверное, вот так:
int (*p)[1] = new int [1][1];

Указатель на массив, элементом которого является массив из одного элемента.
Ы?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[14]: Инициализация указателя на массив
От: _wqwa США  
Дата: 22.10.08 13:18
Оценка:
Здравствуйте, LaptevVV, Вы писали:


LVV>Сидеть дома и писать докторскую , обсуждать с аспирантами их диссеры — и чтоб в институте про меня ЗАБЫЛИ!!!!

LVV>

С аспирантками веселее, небось!
Кто здесь?!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.