Arlleex 183 28 января, 2018 Опубликовано 28 января, 2018 (изменено) · Жалоба Ну, чтобы совсем подлить масла в огонь, можно вбросить "имя двумерного массива не есть указатель на указатель" и "имя массива и указатель это разные вещи". Или, например, "константный указатель это не то же самое что указатель на константу"... И действительно, есть люди которые в упор не видят разницу, когда она там есть. Изменено 28 января, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 28 января, 2018 Опубликовано 28 января, 2018 · Жалоба Ну, чтобы совсем подлить масла в огонь, можно вбросить "имя двумерного массива не есть указатель на указатель" и "имя массива и указатель это разные вещи". Или, например, "константный указатель это не то же самое что указатель на константу"... И действительно, есть люди которые в упор не видят разницу, когда она там есть. Ну указатель то как раз ясно, а вот с остальным так себе... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 28 января, 2018 Опубликовано 28 января, 2018 · Жалоба int arr[2] = {0, 1}; int i; int pi; int *ptr = arr; int ptri; int main(void) { i = arr[1]; pi = *arr+1; ptri = ptr[1]; if( (i == pi) == ptri ) asm("nop"); /* Replace with your application code */ while (1) { } } Для затравки кусок кода: Брэйкпоинт установленный на nop сработает? Сработает. Значит массив это указатель? А указатель это массив? ;) На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот. Кто ответит? ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 28 января, 2018 Опубликовано 28 января, 2018 (изменено) · Жалоба Брэйкпоинт установленный на nop сработает? Сработает. Не сработает. Изменено 28 января, 2018 пользователем gerber Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 28 января, 2018 Опубликовано 28 января, 2018 · Жалоба Не сработает. Сработает! Только вот за конструкции видаif ((i == pi) == ptri) лучше отрубать голову голову сразу. Такой код гораздо хуже случая, когда программер не разбирается в const volatile Гм, а как эта строка вообще работает то ? http://www.includehelp.com/c/how-expressio...rogramming.aspx Гыыы int arr[2] = { 0, 1 }; Ай маладца, а если nt arr[2] = { 0, 2 }; ? Не, реально 10 лет без права переписки за такие хаки The result of (a==B) is 1 (i.e. true). И еще - по стандарту true совсем не обязан быть 1 Строка сравнивает числовое значение true , обычно 1, со значением из массива по первому индексу... глубокомысленно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 28 января, 2018 Опубликовано 28 января, 2018 · Жалоба Я думаю стоит сконцентрироваться на работе с массивом и индексами, сравнением массива с указателями. Ответа на вполне конкретный вопрос пока не поступило. На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Quasar 20 28 января, 2018 Опубликовано 28 января, 2018 · Жалоба Ответа на вполне конкретный вопрос пока не поступило. sizeof ( ptr ) != sizeof ( arr ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx.bilous 0 28 января, 2018 Опубликовано 28 января, 2018 · Жалоба На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот. https://ideone.com/SLqzMw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 28 января, 2018 Опубликовано 28 января, 2018 · Жалоба Ну имя массива это не lvalue , нельзя записать "имя_массива++" например. А указатель - lvalue https://ideone.com/SLqzMw prog.c:8:4: error: assignment to expression with array type a = b; VS дает на такое именно " error C2106: '=' : left operand must be l-value" Я думаю стоит сконцентрироваться на работе с массивом и индексами, сравнением массива с указателями. Ответа на вполне конкретный вопрос пока не поступило. Так а кусок кода что Вы привели - какой смысл имеет и какое отношение к этому? Он попросту ошибочен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx.bilous 0 28 января, 2018 Опубликовано 28 января, 2018 · Жалоба Мне и правда нужно было упоминать что строка девять и строка восемь это тот случай когда "массив поведет себя иначе чем указатель"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 29 января, 2018 Опубликовано 29 января, 2018 (изменено) · Жалоба На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот. Кто ответит? ) Я отвечу. Ознакомьтесь. :laughing: Изменено 29 января, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 29 января, 2018 Опубликовано 29 января, 2018 · Жалоба В C++ крайне нужная весчЬ. Хотя в C++ я не использую это слово по старой привычке, и опираясь на логику некоторых местных товарищей, могу утверждать, что оно не нужно :-) Очень нужная весчЬ - использовать я ее конечно не буду :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Sam_ 0 29 января, 2018 Опубликовано 29 января, 2018 · Жалоба в первом варианте в глобальной константе этот массив помещен в память Flash. Правильное поведение. Во втором варианте в стек - неправильное в третьем варианте во Flash память. По сути первый и третий вариант в вашем случае идентичны и отличаются они только областью видимости, поэтому логично, что один и тот же компилятор делает в этих вариантах одно и то же. Второй вариант отличается тем, что массив живет только во время вызова функции, поэтому запихивать его пожизненно во флэш нелогично. На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот. К имени массива привязан не только адрес, но и размер. Как уже писали выше размеры массива и указателя не равны. #include <iostream> using namespace std; uint32_t na[] = {0,1}; uint32_t *a = na; int main() { if(sizeof(a) == sizeof(na)) cout << "equal"; else cout << "not equal"; // your code goes here return 0; } Еще пример когда в качестве параметра передается ссылка на массив, в этом случае указатель в качестве параметра не пройдет. void func(uint32_t (&na)[2]) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 29 января, 2018 Опубликовано 29 января, 2018 · Жалоба Кто ответит? ) Даже зная как найти ответ всегда хотелось настучать по голове непризнанным гениям ставящим это и подобное на собеседовании. Ну и уж точно не пошел бы контору где такие вопросы задают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 29 января, 2018 Опубликовано 29 января, 2018 · Жалоба Второй вариант отличается тем, что массив живет только во время вызова функции, поэтому запихивать его пожизненно во флэш нелогично. Он в любом случае пожизненно живет во флеш... до вызова функции он живет только во флеш, во время вызова живет и в ОЗУ и во флеш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться