Перейти к содержанию
    

модификатор const. Как правильно использовать в Си

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

Или, например, "константный указатель это не то же самое что указатель на константу"...

И действительно, есть люди которые в упор не видят разницу, когда она там есть.

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Или, например, "константный указатель это не то же самое что указатель на константу"...

И действительно, есть люди которые в упор не видят разницу, когда она там есть.

Ну указатель то как раз ясно, а вот с остальным так себе...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Брэйкпоинт установленный на nop сработает? Сработает.

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

Изменено пользователем gerber

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Сработает!

Только вот за конструкции вида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, со значением из массива по первому индексу... глубокомысленно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

sizeof ( ptr ) != sizeof ( arr )

 

:biggrin:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

https://ideone.com/SLqzMw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

prog.c:8:4: error: assignment to expression with array type

a = b;

VS дает на такое именно " error C2106: '=' : left operand must be l-value"

 

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

 

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

Так а кусок кода что Вы привели - какой смысл имеет и какое отношение к этому? Он попросту ошибочен

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне и правда нужно было упоминать что строка девять и строка восемь это тот случай когда "массив поведет себя иначе чем указатель"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В C++ крайне нужная весчЬ.

 

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

Очень нужная весчЬ - использовать я ее конечно не буду :rolleyes:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в первом варианте в глобальной константе

этот массив помещен в память 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])

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Второй вариант отличается тем, что массив живет только во время вызова функции, поэтому запихивать его пожизненно во флэш нелогично.
Он в любом случае пожизненно живет во флеш... до вызова функции он живет только во флеш, во время вызова живет и в ОЗУ и во флеш.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...