Ponteiros em C

Dr. Marcelo Cohen

09/2014

Ponteiros em C

Versão para impressão


Ponteiros

Piada obrigatória do XKCD:

{@class=center}xkcd
{@class=center}xkcd

http://xkcd.com/138/


Introdução


Ponteiro

{@class=float-right}memory
{@class=float-right}memory

Entendendo os operadores de ponteiro


Ponteiros podem ser maus!


O ponteiro NULL


Ponteiros e arrays


Ponteiros e arrays


Arrays são sempre passados por referência


Aritmética de ponteiros


Aritmética de ponteiros (2)

{@class=center}chararray
{@class=center}chararray
    char* p = c;

    printf("%c\n", *p);     // exibe 'a'
    printf("%c\n", *(p+1)); // exibe 'b'
    printf("%c\n", *(p+2)); // exibe 'c'
    printf("%c\n", *(p+3)); // exibe 'd'
    ...

Aritmética de ponteiros é inteligente!

{@class=center}intarray
{@class=center}intarray
    int m[] = { 3, 2, 1, 4, 5, 6, 9, 8, 7, 10 };

    printf("%p\n", m);     // end. do primeiro elem., e.g. 0x7fff5fbfebf8
    printf("%p\n", &m[0]); // idem
    printf("%p\n", m+1);   // end. do segundo elem., e.g. 0x7fff5fbfebfc
    printf("%p\n", &m[1]); // idem

Experimento: aritmética de ponteiros

#include <stdio.h>

int main()
{
    int vet[] = { 4, 9, 12 };
    int i, *ptr;
    ptr = vet;
    for(i =0; i<3; i++)
        printf("%d ", *ptr++);
    return 1;
}
#include <stdio.h>

int main()
{
    int vet[] = { 4, 9, 12 };
    int i, *ptr;
    ptr = vet;
    for(i =0; i<3; i++)
        printf("%d ", (*ptr)++);
    return 1;
}

Aritmética de ponteiros na prática


Arrays de ponteiros


Outro uso: argumentos para o programa


Exercícios


Exercícios

  1. Considere o seguinte código, que exibe o conteúdo do array junto ao endereço de memória de cada elemento:

    int main()
    {
        int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        int* ptr = nums;
        int i, bytes;
        for(i=0, bytes=0; i<10; i++, bytes+=4)
            printf("%d: %p + %d bytes = %p ==> %d\n",
                i, ptr, bytes, (ptr+i), *(ptr+i));
        return 0;
    }

Exercícios (2)

  1. Você consegue exibir o conteúdo das seguintes varíaveis, usando apenas ponteiros para char (bypes)?

    int main() {
        char* text = "Prog. Sofware Basico";
        int v[] = { 0, 1, 2, 3, 4 };
        int matriz[4][4] = {
            0, 1, 2, 3,
            4, 5, 6, 7,
            8, 9, 10, 11,
            12, 13, 14, 15
        };
    }