|
|
  |
модификатор const. Как правильно использовать в Си |
|
|
|
Jan 28 2018, 19:50
|

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 сработает? Сработает. Значит массив это указатель? А указатель это массив? На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот. Кто ответит? )
--------------------
The truth is out there...
|
|
|
|
|
Jan 28 2018, 20:03
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(sigmaN @ Jan 28 2018, 22:50)  Брэйкпоинт установленный на nop сработает? Сработает. Не сработает.
Сообщение отредактировал gerber - Jan 28 2018, 20:04
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Jan 28 2018, 20:40
|
Гуру
     
Группа: Свой
Сообщений: 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==  is 1 (i.e. true). И еще - по стандарту true совсем не обязан быть 1 Строка сравнивает числовое значение true , обычно 1, со значением из массива по первому индексу... глубокомысленно
|
|
|
|
|
Jan 28 2018, 21:31
|
Участник

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

|
Цитата(sigmaN @ Jan 28 2018, 22:50)  На много интереснее попросить привести примеры где именно массив поведет себя иначе чем указатель и наоборот. https://ideone.com/SLqzMw
|
|
|
|
|
Jan 28 2018, 21:34
|
Гуру
     
Группа: Свой
Сообщений: 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)  Я думаю стоит сконцентрироваться на работе с массивом и индексами, сравнением массива с указателями.
Ответа на вполне конкретный вопрос пока не поступило. Так а кусок кода что Вы привели - какой смысл имеет и какое отношение к этому? Он попросту ошибочен
|
|
|
|
|
Jan 28 2018, 21:38
|
Участник

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

|
Мне и правда нужно было упоминать что строка девять и строка восемь это тот случай когда "массив поведет себя иначе чем указатель"?
|
|
|
|
|
Jan 29 2018, 07:45
|
Местный
  
Группа: Свой
Сообщений: 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])
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|