Тут у мене є вказівник ptr
на масив arr
із 4 цілих чисел. ptr
вказує на весь масив. ptr[0]
або *ptr
вказує на перший елемент масиву, тому додаючи 1, ptr[0]
надає адресу другого елемента масиву.
Я не можу зрозуміти, чому використання sizeof(ptr[0])
дає розмір усього масиву, 16 байт, а не розмір лише першого елемента, 4 байти (як ptr[0]
вказує на перший елемент масиву).
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;
? Власне, ні. int (*ptr)[4]
створює ptr
як вказівник на повний масив з чотирьох int
значень. Синтаксис вказівника на зразок цього необхідний для динамічного розподілу істинно-багатовимірних масивів. "2-мірні масиви", створені за допомогою вкладених malloc()
циклів і неправильно описані як багатовимірні масиви, справді є одновимірними масивами покажчиків на декілька 1-d масивів. Дивіться stackoverflow.com/questions/42094465/…
int *ptr = arr;
? Це вказувало б на початок (перший елемент) масиву, який еквівалентний&arr[0]
.