- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[4] = {1, 2, 3, 4};
int (*a_p1)[4] = (int (*)[4])a;
int (*a_p2)[4] = &a;
for(size_t i = 0; i < 4; ++i)
{
printf("%p -> %d; %p -> %d\n", &(*a_p1)[i], (*a_p1)[i], &(*a_p1)[i], (*a_p2)[i]);
}
return EXIT_SUCCESS;
}
printf("%p -> %d; %p -> %d\n", &(*a_p1)[i], (*a_p1)[i], &(*a_p2)[i], (*a_p2)[i]);
Как думаете, почему
int (*a_p1)[4] = (int (*)[4])a;
и
int (*a_p2)[4] = &a;
означают одну и ту же хуйню? Или есть какая-то разница?
https://wandbox.org/permlink/Bi3wM2Jl2ZmhXzEZ
Это охуенно
https://i.postimg.cc/W1skKn3Z/WS.webp
&a — указывает на сам массив (int(*)[4])
(int (*)[4])a — у a и &a значения одинаковые, но разные типы, приводим, получается однохуственно
Верно?
Так точно: (0x7fffc4da4ea0 == 0x7fffc4da4ea0) is true
*a и a[0] означает одно и то же: первый элемент массива (хотя есть нюанс с sizeof в зависимости от места хранения).
a и &a означают одно и то же, если a — массив.
Но если тот же самый массив завернуть в структуру...
Только для глобальных и статических локальных массивов нужно еще какое-то особое говно, типа компилтайм-аллокации
Так что во всех случаях тупо заменить локальные массивы alloca()-хуйней не выйдет. В каком-нибудь цикле это alloca() может весь стек выжрать запросто
Можно такой указатель кастовать в двойной указатель на void и разыменовывать бесконечное количество раз.
Это уже будет адрес ячейки памяти. А адрес — это именно само значение, у него не может быть адреса, так же как и у, например, числа 42. Ты же не можешь написать &42
Хочу так:
И пусть компилятор (рантайм) перемещает переменную, как хочет.
Это в смысле мы скопировали петуха в some_address, и потёрли оригинала?
https://i.postimg.cc/2843vf1y/7-5.jpg
А в языке «METAFONT» Кнута есть присвоения (:=, как в Паскале) и уравнения. Уравнения пытаются найти значения тех переменных, которые в данный момент undefined. Например:
Этот код найдёт значение pituh, потому что значение kurochka уже известно.
Вот! То что я и имел в виду под «пусть компилятор разбирается». Сразу видно — ма-те-ма-тик писал, а не случайный питух.
Теперь x и y — связанные переменные. Если присвоить значение x, он посчитает y.
Если же написать новое уравнение, в котором указаны обе переменные, то он их обе посчитает:
Системы линейных уравнений он точно решать умеет. Про нелинейные не знаю.
Тут вполне достаточно и одних лишь уравнений. К тому же это все отлично решается в SMT-солверах, например тут https://compsys-tools.ens-lyon.fr/z3/index.php
результат:
Кроме того, бывают сложные случаи типа x = y. Тут нужно выяснять, какая из переменных undefined, какая связанная, какая известна. А если написать x:=y, то состояние x можно проигнорировать и пытаться вычислить y в любом случае.
В чисто декларативных ЯП таких ситуаций не возникает.
Лолбоёбы уже смешали имперации с функци-анальщиной.
Что получили в итоге? Неочевидные правила захвата пельменных (хорошо только в «PHP»), просто говняные отвратно выглядящие языки (привет Scala-хуесосам).
Проблема вылезла в куче недоязычков от С# до JS.
let её никак не решает.
Если где-то проебал var/let пельменная может приехать из внешнего конь-текста.
А всё поцчему?
Вместо того чтобы писать и циклы в едином функциональном стиле c колобками
array.forEach((x)=>...)
Устроили смешивание образов императивного и функционального.
Сначала жертву учат писать императивно. Говорят, что императивный стиль — это хорошо, потому что идеально ложится на железо.
Затем жертву убеждают что использование объектно-ориентированного подхода позволяет сократить стоимость разработки на 12.6% по сравнению с устаревшим процедурным подходом.
Затем жертве говорят, что ООП это уже не модно и нужно использовать функциональный стиль.
Зомбирующий говорит: «Имперации! Функциклонги!»
Ассистенты зомбирующего повторяют: «Декларативность! ООП!»
Таким образом обеспечивается усиление смешивания парадигм.
Затем моду меняют.
Основной смысл - оглупление. Бывают случаи очень сильного падения уровня интеллекта в результате применения этой методики.
> 42 = pituh;
Dubbed Trojan Source, the attack impacts many of the compilers, interpreters, code editors, and code repository frontend services used by software developers. Malicious actors could leverage the method to create code that would be displayed one way in code editors, but be interpreted differently by the compiler.
C, C++, C#, JavaScript, Java, Rust, Go, and Python have been found to be impacted, as well as VS Code, Atom, SublimeText, Notepad, vim, emacs, GitHub and BitBucket.
Соснули все.
Вот именно поэтому я за «ed».
https://govnokod.ru/26423#comment527017
https://ideone.com/dGF2bH
Оба показывают нормально (просто игнорят уникод).
more тоже хорош
А обожаемый мною less идеален:
А вот сцинтильная заедушатина сливает, да.
Опровергаю. И без них можно обосраться:
Это не отменяет того, что существуют другие способы обосраться.
Мина замедленного действия это такая мина, на которую допустим случайно наступил, проходя мимо, а она только через час взорвется?
Поэтому ненужный код лучше прятать в #ifdef, а не в комментарии.
Программисту достаточно говноскриптом пройтись по всем исходникам и выпилить нахер всю эту питушню с отзеркаливанием текста. Можно в компилятор даже встроить какую-то хуйню, чтоб он варнинг писал на такое.
А нахуя она в строковых литералах? Если у тебя RTL и прочая питушня в строке, то это скорее всего должно хранится внешне в ресурсах, чтобы не пересобирать проект каждый раз, когда потребуется поправить правописание. Ну и чтобы переводчики могли независимо от программистов работать.
А если это внутренние строки для логирования и прочей питушни, то только ASCII, только хардкор.
> указывает на сам массив
в сишке это одно и тоже: указатель на первый элемент равен указателю на сам массив
имено потому массивы с ноля
Попробуй джага-джага
я имел ввиду что в данном случае нет разницы, а между
petuh* a;
и
petuh a[22]
конечяно е
как я могу массив в указатель скопировать?
я думал, компилятор когда справа массив видит, сразу нахуй посылает, если ты явно не кастанул
А про массив заходящий я знаю.
Ебадад потом делает ему sizeof() и итерируется, и всё работает годами, потому что размер массива оказался развен размеру указателя
Кстати, это забавный момент, когда "&a" равно "a"
Буква L в названии языка C означает Logic.
С помошью мемсру если моссив маленький или указатель достаточно разработан.
в данном случае нет разницы указатель на инт или указатель на массив интов, если ты ождиаешь четыре инта
как я могу массив в указатель скопировать?
Попробуй джага-джага