реклама на сайте
подробности

 
 
8 страниц V  « < 3 4 5 6 7 > »   
Reply to this topicStart new topic
> модификатор const. Как правильно использовать в Си
Arlleex
сообщение Jan 28 2018, 17:09
Сообщение #61


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Ну, чтобы совсем подлить масла в огонь, можно вбросить "имя двумерного массива не есть указатель на указатель" и "имя массива и указатель это разные вещи".
Или, например, "константный указатель это не то же самое что указатель на константу"...
И действительно, есть люди которые в упор не видят разницу, когда она там есть.

Сообщение отредактировал Arlleex - Jan 28 2018, 17:12
Go to the top of the page
 
+Quote Post
DASM
сообщение Jan 28 2018, 17:44
Сообщение #62


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Arlleex @ Jan 28 2018, 20:09) *
Ну, чтобы совсем подлить масла в огонь, можно вбросить "имя двумерного массива не есть указатель на указатель" и "имя массива и указатель это разные вещи".
Или, например, "константный указатель это не то же самое что указатель на константу"...
И действительно, есть люди которые в упор не видят разницу, когда она там есть.

Ну указатель то как раз ясно, а вот с остальным так себе...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 28 2018, 19:50
Сообщение #63


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Код
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 сработает? Сработает. Значит массив это указатель? А указатель это массив? wink.gif

На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот.

Кто ответит? )


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
gerber
сообщение Jan 28 2018, 20:03
Сообщение #64


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(sigmaN @ Jan 28 2018, 22:50) *
Брэйкпоинт установленный на nop сработает? Сработает.

Не сработает.

Сообщение отредактировал gerber - Jan 28 2018, 20:04


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
DASM
сообщение Jan 28 2018, 20:40
Сообщение #65


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(gerber @ Jan 28 2018, 23:03) *
Не сработает.

Сработает!
Только вот за конструкции вида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==cool.gif is 1 (i.e. true). И еще - по стандарту true совсем не обязан быть 1

Строка сравнивает числовое значение true , обычно 1, со значением из массива по первому индексу... глубокомысленно
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 28 2018, 20:51
Сообщение #66


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Я думаю стоит сконцентрироваться на работе с массивом и индексами, сравнением массива с указателями.

Ответа на вполне конкретный вопрос пока не поступило.
Цитата
На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Quasar
сообщение Jan 28 2018, 21:15
Сообщение #67


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(sigmaN @ Jan 28 2018, 23:51) *
Ответа на вполне конкретный вопрос пока не поступило.


sizeof ( ptr ) != sizeof ( arr )

biggrin.gif
Go to the top of the page
 
+Quote Post
alx.bilous
сообщение Jan 28 2018, 21:31
Сообщение #68


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 18-03-12
Пользователь №: 70 865



Цитата(sigmaN @ Jan 28 2018, 22:50) *
На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот.

https://ideone.com/SLqzMw
Go to the top of the page
 
+Quote Post
DASM
сообщение Jan 28 2018, 21:34
Сообщение #69


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Ну имя массива это не lvalue , нельзя записать "имя_массива++" например. А указатель - lvalue

Цитата(alx.bilous @ Jan 29 2018, 00:31) *

prog.c:8:4: error: assignment to expression with array type
a = b;
VS дает на такое именно " error C2106: '=' : left operand must be l-value"

Цитата(sigmaN @ Jan 28 2018, 23:51) *
Я думаю стоит сконцентрироваться на работе с массивом и индексами, сравнением массива с указателями.

Ответа на вполне конкретный вопрос пока не поступило.

Так а кусок кода что Вы привели - какой смысл имеет и какое отношение к этому? Он попросту ошибочен
Go to the top of the page
 
+Quote Post
alx.bilous
сообщение Jan 28 2018, 21:38
Сообщение #70


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 18-03-12
Пользователь №: 70 865



Мне и правда нужно было упоминать что строка девять и строка восемь это тот случай когда "массив поведет себя иначе чем указатель"?
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jan 29 2018, 05:42
Сообщение #71


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата
На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот.

Кто ответит? )

Я отвечу. Ознакомьтесь. laughing.gif

Сообщение отредактировал Arlleex - Jan 29 2018, 05:58
Go to the top of the page
 
+Quote Post
sidy
сообщение Jan 29 2018, 06:52
Сообщение #72


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Цитата(Quasar @ Jan 28 2018, 12:14) *
В C++ крайне нужная весчЬ.

Хотя в C++ я не использую это слово по старой привычке, и опираясь на логику некоторых местных товарищей, могу утверждать, что оно не нужно :-)

Очень нужная весчЬ - использовать я ее конечно не буду rolleyes.gif
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Jan 29 2018, 07:45
Сообщение #73


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Цитата
в первом варианте в глобальной константе
этот массив помещен в память 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])



Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jan 29 2018, 08:19
Сообщение #74


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(sigmaN @ Jan 28 2018, 22:50) *
Кто ответит? )

Даже зная как найти ответ всегда хотелось настучать по голове непризнанным гениям ставящим это и подобное на собеседовании. Ну и уж точно не пошел бы контору где такие вопросы задают.
Go to the top of the page
 
+Quote Post
juvf
сообщение Jan 29 2018, 09:14
Сообщение #75


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(_Sam_ @ Jan 29 2018, 12:45) *
Второй вариант отличается тем, что массив живет только во время вызова функции, поэтому запихивать его пожизненно во флэш нелогично.
Он в любом случае пожизненно живет во флеш... до вызова функции он живет только во флеш, во время вызова живет и в ОЗУ и во флеш.
Go to the top of the page
 
+Quote Post

8 страниц V  « < 3 4 5 6 7 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 15:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01497 секунд с 7
ELECTRONIX ©2004-2016