powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на массив. что это такое ?
25 сообщений из 158, страница 2 из 7
указатель на массив. что это такое ?
    #39969066
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81у меня это работает :)

Но у тебя первый параметр - не массив.


да, не массив . но каким-то удивительным образом вот это массив:
arr5 x;
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969070
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravЯ ответил по сути и ответил правильно. Или эта тема — уже табу?

Эта тема - флеймогенератор. Но если настаиваешь - пожалуйста, можешь дальше пытаться
объяснять почему "typedef int[5] arr5; arr5 x;" не работает, раз уж массив это тип.

Т.е. ты код написал не корректный, а я должен что-то доказывать на этом основании? Каким процентом от своей зарплаты ты готов делиться на регулярной основе за такое развлечение?
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969074
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
petrav

Тут "a" — это указатель на массив. В первом случае ты ему пытаешься присвоить указатель на первый элемент массива. Ну корректно ли это?

ну а почему не корректно то ?
ты же сам писал:
В "a" содержится указатель на массив. По факту, в нём содержится указатель на первый элемент массива. Но по сути в нём содержится указатель на массив.

итого имеем :
1) f это массив из 5 интовых элементов. в f(или в &f[0]) содержится адрес первого элемента.
2) переменная a указатель на массив из 5 элементов. и читаем что ты писал(а с этим я согласен)

то есть по сути всё соблюдено наверно .
а нет...

Да ты пойми простую вещь. Есть тип. Неважно что это за тип: int, структура или массив. У тебя есть указатель на переменную этого типа. Понятно, что этот указатель по факту содержит указатель на первую переменную в этом типе. По факту! Но по сути он содержит указатель на этот тип. Точнее на переменную этого типа.
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969077
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
andron81
пропущено...

ну а почему не корректно то ?
ты же сам писал:
В "a" содержится указатель на массив. По факту, в нём содержится указатель на первый элемент массива. Но по сути в нём содержится указатель на массив.

итого имеем :
1) f это массив из 5 интовых элементов. в f(или в &f[0]) содержится адрес первого элемента.
2) переменная a указатель на массив из 5 элементов. и читаем что ты писал(а с этим я согласен)

то есть по сути всё соблюдено наверно .
а нет...

Да ты пойми простую вещь. Есть тип. Неважно что это за тип: int, структура или массив. У тебя есть указатель на переменную этого типа. Понятно, что этот указатель по факту содержит указатель на первую переменную в этом типе. По факту! Но по сути он содержит указатель на этот тип. Точнее на переменную этого типа.


есть разница по твоей теории между кодами ?
Код: plaintext
1.
2.
3.
4.
    int f[5] = { 1,2,3,4,5 };
    int(*a)[5];
    a = &f[0];
    a = f;



Код: plaintext
1.
2.
3.
    int f=5;
    int *a;
    a = &f;


первый код не рабочий, второй рабочий
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969078
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
petrav
пропущено...

Да ты пойми простую вещь. Есть тип. Неважно что это за тип: int, структура или массив. У тебя есть указатель на переменную этого типа. Понятно, что этот указатель по факту содержит указатель на первую переменную в этом типе. По факту! Но по сути он содержит указатель на этот тип. Точнее на переменную этого типа.


есть разница по твоей теории между кодами ?
Код: plaintext
1.
2.
3.
4.
    int f[5] = { 1,2,3,4,5 };
    int(*a)[5];
    a = &f[0];
    a = f;



Код: plaintext
1.
2.
3.
    int f=5;
    int *a;
    a = &f;


первый код не рабочий, второй рабочий

Тут-то что не понятно? Кури Кернигана-Ритчи снова.

Представь себе, что у нас есть координаты истока Днепра. По факту это некий ручей, но по сути это начало реки.
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969079
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
andron81
пропущено...


есть разница по твоей теории между кодами ?
Код: plaintext
1.
2.
3.
4.
    int f[5] = { 1,2,3,4,5 };
    int(*a)[5];
    a = &f[0];
    a = f;



Код: plaintext
1.
2.
3.
    int f=5;
    int *a;
    a = &f;


первый код не рабочий, второй рабочий

Тут-то что не понятно? Кури Кернигана-Ритчи снова.

Представь себе, что у нас есть координаты истока Днепра. По факту это некий ручей, но по сути это начало реки.


Я и учу по нему. Не понятно почему первый код не катит.
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969086
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
a guestКакая связь между тем, что массив это тип и тем, почему код (не) должен работать?
В спецификации typedef написано "первый параметр - тип".Ну возьмём, например, драфт C11 или драфт C++17 . Где там такое написано?
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969087
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andron81
то есть дело то может быть в синтаксисе . да, так нельзя :

typedef int[5] arr5;
а вот так можно :
typedef int arr5[5];

то есть логичнее на мой взгляд вот наподобие как студенческом паскале :
typedef int[5] arr5;
Это было бы логичнее, если бы переменные объявлялись как `int[5] arr5;`.
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969088
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
andron81
то есть дело то может быть в синтаксисе . да, так нельзя :

typedef int[5] arr5;
а вот так можно :
typedef int arr5[5];

то есть логичнее на мой взгляд вот наподобие как студенческом паскале :
typedef int[5] arr5;
Это было бы логичнее, если бы переменные объявлялись как `int[5] arr5;`.

Собственно Страуструп в какой-то своей книге и писал, что очень недоволен синтаксисом Си. И даже приводил примеры объявлений переменных, которые синтаксически корректны, но откомпилировать их невозможно.

И про массивы он, кажется, как раз и писал что логичнее `int[5] arr5;`, но внедрить это невозможно.
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969089
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest,

Да, разумеется

Но по каким-то причинам оформляется и тайпдеф и сама переменная как объявляется.
И кстати тогда можно было бы с уверенностью сказать, что int[5] это тип. Поэтому я склончюсь больше к идеи Сибирякова.
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969090
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav
Собственно Страуструп в какой-то своей книге и писал, что очень недоволен синтаксисом Си. И даже приводил примеры объявлений переменных, которые синтаксически корректны, но откомпилировать их невозможно.
Это как?
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969096
andron81
petrav,

Верно ли я понимаю что грубо говоря в *var содержится адрес на первый элемент массива ?

чтобы было понятнее, лучше представлять любую переменную, как ячейку памяти, где лежит некий байт
a, b, data, var - всё это ячейки в памяти, которые нам (людям) проще читать словами, а компу конечно цифрой (адрес ячейки)
а когда нам нужен адрес ячейки, то мы его получаем через &var, а доступ к данным через *var
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969098
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
petrav
Собственно Страуструп в какой-то своей книге и писал, что очень недоволен синтаксисом Си. И даже приводил примеры объявлений переменных, которые синтаксически корректны, но откомпилировать их невозможно.
Это как?

Я точно не помню. Может я слегка перегнул палку, но Бьёрн приводил какие-то совершенно мозголомные примеры объявлений переменных... и там реально была жуткая путаница. И Страуструп как раз и писал, что хотел бы переделать систему типов Си, но не мог сделать этого. Кажется в книге "Дизайн и эволюция С++", но я точно не помню название.
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969099
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот как это работает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <stdio.h>

int main() {
	int mat[3][5];

	for (int i = 0; i<3; i++) {
		for (int j=0; j<5; j++) {
			mat[i][j] = i*10 + j;
		}
	}

	int (*a)[5];
	a = mat;
	//a = &mat[0]; //works as well

	for (int i=0; i<3; i++) {
		for (int j = 0; j<5; j++) {
			printf("%4d ", *(*(a+i) +j) );
		}
		printf("\n");
	}
}


и я еще раз повторю, что нужно различать указатель на массив от массива указателей
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969105
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabprintf("%4d ", *(*(a+i) +j) );

А по-хорошему-то тут должно было бы быть "(*a)[j]" и дальше простое a++... Это если бы а
реально было указателем на массив из пяти целых чисел...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969106
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
верен любой из способов (поправила)

Код: plaintext
1.
arr[i][j] = (*(arr+i))[j] = *((*(arr+i))+j) = *(arr[i]+j)
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969110
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но увеличит ли операция а++ значение а на sizeof(int[5])?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969116
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
вот как это работает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <stdio.h>

int main() {
	int mat[3][5];

	for (int i = 0; i<3; i++) {
		for (int j=0; j<5; j++) {
			mat[i][j] = i*10 + j;
		}
	}

	int (*a)[5];
	a = mat;
	//a = &mat[0]; //works as well

	for (int i=0; i<3; i++) {
		for (int j = 0; j<5; j++) {
			printf("%4d ", *(*(a+i) +j) );
		}
		printf("\n");
	}
}


и я еще раз повторю, что нужно различать указатель на массив от массива указателей


Понимаете , глупая логика моя следующая :
int (*a)[5]; - это указатель на массив , содержащий "строку" из 5 целых чисел.
int f[5] - это "строка" из 5 целых чисел.

в башке четко отложилось, что f это указатель на первый элемент массива, а значит (возможно ошибочно), что это как раз и есть указатель на "строку" из 5 целых чисел.
поэтому я думал , что a=f наверно безошибочно.
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969117
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я думаю тут имеет смысл говорить о перемещениях

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
#include <stdio.h>

int main() {
	int mat[3][5];

	for (int i = 0; i<3; i++) {
		for (int j=0; j<5; j++) {
			if (i==0 && j==0) {
				mat[i][j] = 111;
			}
			else {
				mat[i][j] = i*10 + j;
			}
		}
	}

	int (*a)[5];
	a = mat;
	//a = &mat[0]; //works as well


	for (int i=0; i<3; i++) {
		for (int j = 0; j<5; j++) {
			printf("%4d ", *( (*(a+i)) +j) );
		}
		printf("\n");
	}

	//Steps

	for (int i=0; i<3; i++) {
		printf("%p, %p\n", *(a++), mat[i]);
	}

	printf("Last element: %d\n", *((*(a-1)) + 4) );
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Output

 111    1    2    3    4 
  10   11   12   13   14 
  20   21   22   23   24 
0x7fff8a9891b0, 0x7fff8a9891b0
0x7fff8a9891c4, 0x7fff8a9891c4
0x7fff8a9891d8, 0x7fff8a9891d8
Last element: 24
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969119
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81


Понимаете , глупая логика моя следующая :
int (*a)[5]; - это указатель на массив , содержащий "строку" из 5 целых чисел.
int f[5] - это "строка" из 5 целых чисел.

в башке четко отложилось, что f это указатель на первый элемент массива, а значит (возможно ошибочно), что это как раз и есть указатель на "строку" из 5 целых чисел.
поэтому я думал , что a=f наверно безошибочно.


если говорить об адресации, то логика норм,
вы делаете ошибку в dereferencing (не знаю как перевести)
поэтому я выписала правила
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969122
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab

... dereferencing (не знаю как перевести)

это переводится - разыменование - снятие косвенности
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969123
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab

вы делаете ошибку в dereferencing (не знаю как перевести)

Разыменование.
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969132
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

поэтому я выписала правила

а выписали правила где, простите ?
...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969135
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот:
mini.weblab
верен любой из способов (поправила)

Код: plaintext
1.
arr[i][j] = (*(arr+i))[j] = *((*(arr+i))+j) = *(arr[i]+j)

...
Рейтинг: 0 / 0
указатель на массив. что это такое ?
    #39969163
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а тут petrav объясняет почему так происходит
petrav

Да ты пойми простую вещь. Есть тип. Неважно что это за тип: int, структура или массив. У тебя есть указатель на переменную этого типа. Понятно, что этот указатель по факту содержит указатель на первую переменную в этом типе. По факту! Но по сути он содержит указатель на этот тип. Точнее на переменную этого типа.
...
Рейтинг: 0 / 0
25 сообщений из 158, страница 2 из 7
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на массив. что это такое ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]