21

(17 відповідей, залишених у C++)

koala написав:
mimik написав:

як він перетворюється на вказівник тоді?

Що значить "як"? За правилами мови. Коли ви пишете

int a = 'A';

У вас же не викликає подиву таке перетворення - char на int? То в чому проблема в автоматичному перетворенні int [10] на int* за певними правилами? Просто компілятор виконує таку роботу, от і все.

Перетворення char на int не викликає такого подиву, можливо, хоча б тому, що ім'я змінної не так часто зустрічається, на мою думку. А от "ім'я масиву" доволі часто згадується у темах в книжках чи статтях де так чи інакше намагаються пояснити роботу масивів в С++. Тому мені здається, що це не дивно чому виникають такі питання, адже навіть коли я шукав відповідь на своє питання в інтернеті, то натрапляв на приблизно такі ж теми (в тому числі і на stackoverflow), де навіть гуру з репутацією могли давати різні відповіді. Тому це трохи заплутує, може скластися враження ніби ім'я масиву - це щось окреме.

22

(17 відповідей, залишених у C++)

Так, вже теж нагуглив, що ім'я масиву - це ім'я масиву. Але що це тоді таке? І як він перетворюється на вказівник тоді?

23

(277 відповідей, залишених у Організація роботи форуму)

А, як тут можна редагувати повідомлення, щось ніяк не можу знайти?

24

(17 відповідей, залишених у C++)

Вітаю. Намагаюся зрозуміти, що таке ім'я масиву в С++. Я вже вроді не зовсім новачок в С++, але деякі моменти вроді зрозумілі, а вроді і не зовсім. Власне погугливши про це в інтернеті, як я зрозумів це таки вказівник, саме тому до імені масиву може бути застосована арифметика вказівників.
Але раз це вказівник, отже він десь може знаходитися в пам'яті та мати свій адрес? А раз така комірка пам'яті є, то, по ідеї, можна дізнатися її адресу так - &arr? На жаль такий трюк не працює і виходить, що &arr == arr. Для мене цей момент не зрозумілий. Чи ім'я масиву це таки посилання, раз не виділяється нічого?

int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int* parr = arr; // parr вказує на перший елемент arr, якщо arr (ім'я масиву) це вказівник,
                 // то чому parr вказує на arr[0]? отже arr це посилання?
std::cout << "arr = " << arr + 0 << " parr = " << parr + 0;

25

(14 відповідей, залишених у C++)

Почитав детальніше про цей VLA, але хіба в С++ він не підтримується?
Як я розумію деякі компілятори використовують VLA в С++?

26

(14 відповідей, залишених у C++)

А в чому сенс там використання static в С?

27

(14 відповідей, залишених у C++)

Перевірив, дійсно... Знав, що sizeof вказівника дасть розмір вказівника. Але так само знаю, що sizeof масиву дасть розмірність масиву. А чому тоді масиви передаються за посиланнями? Посилання це вроді &, а тут буде вроді як *

Мова С++, а що у мові С оголошення масиву в параметрі функції має значення?

28

(14 відповідей, залишених у C++)

Вітаю всіх. Поясніть мені, що відбувається з виділенням пам'яті при виконанні функції foo в наступному коді:

void foo(char arr[5])
{
  for (int i = 0; i < sizeof(arr); i++) {
    printf("%c", arr[i]);
  }
  printf("\n");
}
 
int main()
{
  char* str = "hello";
  foo(str);
}

Очевидно, вказівнику arr буде присвоєно значення str. Але незрозуміло, що відбувається в частині char arr[5].
Поки я розумію це так, що при виконанні функції foo на стеку буде виділено 5 байт пам'яті, але вказівнику arr не буде надано адресу початку цієї пам'яті, а буде присвоєно адресу покажчика str. 5 байт будуть даремно виділені?

29

(8 відповідей, залишених у C++)

Всім дякую, тепер зрозуміло чому воно не працювало.

30

(8 відповідей, залишених у C++)

Добре, глянув. А чому тоді в операторі if все ок?

31

(8 відповідей, залишених у C++)

Дивно чому видається помилка, хоча я ж надав оператор перетворення в bool.

32

(8 відповідей, залишених у C++)

Вітаю, я тут намагаюся розібратися з операторами перетворення і чомусь отримую дивну помилку.
Є деяка сутність, яка вміє бути bool'ом

struct Object {
    explicit operator bool() const {
        return true;
    }
};

це добре працює, наприклад в if'і

if (object) std::cout << "TRUE\n";

але ось так

bool func() {
    return object;
}

компілятор свариться, що no viable conversion from returned value of type 'Object' to function return type 'bool'.
Щось я не розумію чому так?

33

(5 відповідей, залишених у C++)

Тобто це таки різні штуки?
І для вказівників краще використовувати uinptr_t

34

(5 відповідей, залишених у C++)

У чому різниця між uinptr_t, size_t, ptrdiff_t?
Я от прочитав, що тип size_t - це беззнаковий тип і що в нього можна помістити вказівник, але навіщо тоді є тип uinptr_t?
Яка тоді між ними різниця?

35

(9 відповідей, залишених у C++)

mimik написав:

Тобто в будь-якому випадку вона не гірше вказівника?

"Не гірше" в якому сенсі, ще раз?

Посилання може бути гірше передачі за значенням. У ряді випадків. Чи запросто може бути гірше з точки зору зручності читання коду.

36

(9 відповідей, залишених у C++)

Для ефективності.
А чому ніякого краще немає? Якщо ви самі сказали, що на етапі компіляції компілятор може зробити оптимізації.
Тобто може бути таке що посилання якраз не вимагає ніякого місця в пам'яті або буде вести себе як вказівник.
Тобто в будь-якому випадку вона не гірше вказівника?

37

(9 відповідей, залишених у C++)

Тобто в більшості випадків при передачі параметрів у функцію краще використовувати посилання?

38

(9 відповідей, залишених у C++)

Я прочитав, що посилання зазвичай реалізовуються через вказівники, але скільки тоді займає посилання?

int a = 0;
int *p = &a;

На x64 системі p буде розміром 8 байт. Як влаштовані посилання в аналогічній ситуації?

int a = 0;
int& r = a;

Скільки буде місця займати r як посилання?
І, яким ще методом можуть бути реалізовані посилання?

39

(14 відповідей, залишених у C++)

Так, додатково погугливши і краще розібравшись у питання мені стало все більш-менш зрозуміло.
Всім дякую за відповіді.
cheappi386, чому дивні? Про PEB та TEB подивлюся, дякую.

40

(14 відповідей, залишених у C++)

koala, дякую, загалом все зрозуміло.
Але ж наприклад під час роботи програми вже немає ніяких таблиць?