Um adendo: Variaveis de tamanho fixo como numbers e boolean, ficam armazenadas na Stack de memoria, por esse motivo, quando vc atribui y = x, sendo x um Number, o programa consegue copiar o valor de x para y. Quando estamos lidando com variaveis de tamanho relativo (podem ser alteradas, sem serem recriadas) como arrays, na Stack apenas ficara alocado o endereco de memoria do Heap onde o valor da variavel esta armazenado. Desse modo, quando vc atribui y = x, sendo x um array, vc esta atribuindo a y um endereco (ou ponteiro) que esta alocado na Stack, e nao o valor de x. Isso ocorre porque a Stack precisa ter um tamanho determinado na hora da execucao, entao algumas linguagens como Rust, escolhem fazer deste modo sua arquitetura (alocando variaveis de tamanho relativo no Heap). Posso ter me enganado em algo, mas eh por ai... li essa explicacao no livro The Rust Programming Language.
Certíssimo! Em rust você também pode criar seus próprios tipos que clonam por padrão sem a necessidade de chamar o metodo clone() explicitamente Basta adicionar #[derive(Copy, Clone)]
No exemplo de python com lista, x já é um ponteiro que aponta para um objeto do tipo lista. Quando rodar x = y, o valor de x é copiado para y, portanto a referência contida em x é passada por valor para y. E assim, tanto x como y passam a apontar para o mesmo objeto do tipo lista.
Incrível que certas coisas que aprendemos há 10, 15 ou n anos atrás voltam a evidência, como no caso dos ponteiros. Minha segunda linguagem na faculdade foi C e isso foi o "Mindblowing" naquele momento. Quando chegamos no Java (na minha época era a matéria de linguagem de programação III) o professor tinha falado: ponteiros? Você até pode mexer isso no Java, mas esquece isso porque nossa máquina virtual Java vai cuidar disso pra você. É isso aí
Muito legal você abordar os ponteiros. Mesmo quem desenvolve em linguagens que não tem ponteiros é bom conhecer e entender o funcionamento. Isso que você se ateve somente ao ponteiro de uma variável, mas há ponteiros para estrutura (struct) , ponteiros para funções que acho demais. Já deixei o C há um bom tempo, hoje trabalho com Perl que não é muito comum no mercado mas tem um poder grande em passagem de ponteiros de estruturas hash, pode tanto passar o ponteiro de um hash inteiro quanto só único item do hash para aumentar velocidade de processamento.
Que conteúdo bom. Tô gostando muito do seu canal. Python foi a minha primeira linguagem, antes mesmo do HTML. Recentemente venho aprendendo java por causa da faculdade e apesar de entender o porquê dos memes com ela, tô achando bem legal. Também planejo estudar C, C++ e Rust pra aprender mais sobre esses conceitos avançados de ponteiros, stack, heap, threads, garbage collector, Big O notation etc.
na hora que voce explica a declaração do porque o ponteiro é um int, sua explicação foi equivocada. Você declara o ponteiro como int *y porque o endereço de memória que você está guardando armazena um inteiro, logo, caso fosse um ponto flutuante, seria float *y. Isso porque espaços de memória sao reservados de acordo com a demanda de bits do respectivo tipo de dado armazenado, portanto o tipo deve ser especificado. Não tem nada a ver com o identificador do espaço de memória
sim, tbm estranhei isso. em 5:28, eu queria tbm q ele explicasse q o x n guarda o vetor, e sim o ponteiro tbm, mas pelo menos ele avisou q foi uma simplificação. no mais o vídeo tá mto bom, o Augusto faz um trabalho excepcional introduzindo esses assuntos pros javascriptos
Em C vc não é obrigado a especificar o tipo do ponteiro, tanto que pode declarar algo como void *i e fazer i = malloc(sizeof(float)); ou i = (void *) &. Os tipos são úteis na hora de fazer aritmética de ponteiros.
Muito bem, um int em C armazenamento 4 Bytes por exemplo(na maioria dos compilers), um char 1 Byte. Arrais é são uma sequência de endereços alocados em sequencia a partir do primeiro índice, é quase que lindo qnd entendemos isso em C. Mas queima neurônios até consagrar a sabedoria.
Gostei do video, confesso q eu nao tenho tanto conhecimento afundo da linguagem, mas eu entendi o que você quis dizer, e realmente, eu nunca vi ponteiros e fiquei um pouco perdido mas entendi sua explicação !
Um dos problemas muito comum no javascript é passar uma variável por um parâmetro de uma função e modificar esse parâmetro internamente na função refletindo na variável passada. function modificarObjeto(obj) { // Modificando a propriedade do objeto obj.nome = "Novo Nome"; } Esse tipo de uso já vi causar muitos problemas - inclusive o lint nem deixa fazer isso.
Baita vídeo Galego! Creio que nós pythonicos só aprendemos isso quando esbarramos na necessidade de usar .deepcopy kkkkk pelo menos comigo foi assim. Um abraço!
Noossa, que inferno foi depurar um código gigante sem fazer ideia de onde estava o problema por não conhecer o .deepcopy. Tu rssgatou traumas que eu não lembrava kkkkkkkkk
eu aprendi tudo isso em Go kkk, e os Slices que seriam os Arrays sem tamanho fixo de la, tem o atributo de apontar pro endereço de memória por de baixo dos panos, por isso em Go fica claro questões de uso do Array e de Slices q sao bem mais utilizados la, do q outras linguagens
5:32 No meu entendimento, o que aconteceria então, seria y apontando para o primeiro elemento da lista de x (index 0), e por meio de aritmética de ponteiros, conseguiríamos acessar os outros valores, e aplicar funções como no caso, o append( ), certo? Ou é algo além disso?
@@luizfilipe7630Faz sentido. Se estivéssemos lidando com um array dinâmico, surgiriam algumas considerações adicionais. Adicionar elementos no início e no final da fila seria facilmente resolvido utilizando uma lista encadeada circular. Mas isso apenas resolveria o problema para a função append, outras funcionalidades, que necessitariam acessar um elemento na lista de index qualquer teriam mais trabalho para encontrar o índice apropriado. Isso com certeza ia ter mais custo computacional do que simplesmente criar uma nova instância da lista de tamanho n+1 com os valores copiados. Depois é só desalocar a antiga lista, o que provavelmente é feito de forma automática em python, imagino eu.
@@TokaGado a estrutura dos ponteiros de uma variável pode ser local ou global e isso gera comportamentos estranhos no JS se comparado com outras linguagens.
Cara isso é mt legal vei, quero aprender mais disso onde eu posso ler ou aprender esse tipo de conteúdo? (Eu vou pesquisar mas se vocês tiverem uma boa fonte por favor compartilhar)
To a 12 anos mexendo com o assembly da at & t e te digo, não existe "variaveis" são apelidos dados a endereços de memoria, e o quanto antes o pessoal novato entender isso, mais facil fica ponteiros....
5:55 / 6:33 Pera, quer dizer então que, em python, quando é criada uma variável que recebe outra variável individual , `y = x`, indiretamente é um 'ponteiro' da variável individual. Mas e se for passada um complemento para essa variável? `y = x + 1` Vai ser criado um endereço novo diretamente na memória?
Cara isso depende mais de qual tipo de dado você está trabalhando. Geralmente nos temos os tipos "primitivos" que criariam um novo endereço de memoria só que se você trabalha com JavaScript, especialmente com a biblioteca React você vai ver muitas bizarrices se você não entender sobre o que o Augusto falou. Por exemplo, em React trabalhamos com estados e se o seu estado for um objeto, você vai ter que ter uma atenção a mais para altera-lo, e você vai usar muito o conceito de "DeepCopy" e "ShadowCopy". Eu não vou me estender porque se eu fosse escrever tudo iria dar um texto gigantesco, mas só com esses conceitos você pode procurar e entender melhor.
Pelo que entendi, quando são valores como inteiros, ele apenas faz uma cópia e não usa referência. Ele vai utilizar de ponteiros quando são listas, e ai sim ele altera o mesmo valor indepentende de qual variável é alterado.
É interessante ver um pouco sobre variáveis mutáveis e imutáveis. No geral as imutáveis tem seus valores copiados para o endereço de memória da nova variável e os mutáveis tem o a sua referência de memória atribuído a nova variável. Entao x = 5 e y = x, o x não tem a mesmo referência de memoria de y, mas no exemplo mostrado no video o array é mutável.
03:08 - Bem, eu acho que você poderia ter só dito que era um operador address-of, que é um E comercial (&) que antecede uma variável, retornando seu endereço de memória