Ponteiros Operadores – & – obtém o ponteiro (endereço) de uma variável Linguagem C • p=&x; /* o ponteiro p recebe o endereço de x */ – * – faz acesso a uma variável indicada por um ponteiro • i=*p; /* i recebe o valor indicado pelo ponteiro p */ Declaração de uma variável ponteiro 2ª Parte tipo *nome_da_variável; int *px; /* px aponta para uma variável do tipo int */ – Exemplo: • int x, y; • y=10; • x=*(&y)+4; Ponteiros void main() { int x, *px, y, *py; px=&x; py=&y; x=1; /* idêntico a *px=1 */ *py=2; /* idêntico a y=2 */ printf(“*px=%d”, *px); printf(“\ny=%d\n”, y); } Parâmetros do scanf() Atenção: os parâmetros do scanf são referências (ponteiros) às variáveis que serão lidas Se uma rotina já tem uma referência à uma variável e lê através dessa referência usando scanf, então essa variável não deve ser precedida pelo & no parâmetro do scanf Veja o exemplo /* ≡ x=y+4; o conteúdo do endereço da variável é o valor da variável */ Ponteiros e Argumentos de Funções Em Pascal: Em C: PROCEDURE SWAP(VAR X, Y: INTEGER); VAR TEMP: INTEGER; BEGIN TEMP:=X; X:=Y; Y:=TEMP END; void swap(int *x, int *y) { int temp; temp=*x; *x=*y; *y=temp; } void main() { int a=1, b=2; swap(&a, &b); ... Parâmetros do scanf() void leIntTeclado(int *x) { scanf(“%d“, x); } x já é uma referência void main() { (ela contém o endereço de var), não use o & no scanf ! int var; leIntTeclado(&var); printf(“O valor lido e\’: “, var); } 1 Vetores Matrizes Declaração: Declaração: tipo nome_do_vetor [número_de_elementos]; int v[10]; /* define um vetor de inteiros com 10 elementos */ ATENÇÃO: 10 posições declaradas de v[0] a v[9] A linguagem C implementa vetores como: – área contígua de memória para armazenar os dados – um ponteiro (nome_do_vetor) indicando o primeiro elemento do vetor Assim v[i] ≡ *(v+i), de outra forma &v[i] ≡ v+i Cadeias de Caracteres Definição: Fazendo acesso: – i=m[ j ][ k ]; – m[ i ][ j ]=30; – Lembre-se que m[ j,k ] ≡ m[ k ] Vetores como Argumentos de Funções Como em C todo vetor é: char nome_da_variável[comprimento]; Exemplo: char str1[10], str2[10], str3[10]; char c; void main() { strcpy(str1,”abcdefghi”); c=‘a’; strcpy(str2,”abcdefghij”); /* sem espaço para o nulo */ c=“a”; /* cadeia de caracteres em um char */ str3=”abcdefghi”; /* o espaço do vetor seria perdido */ ... Sempre se considera o espaço ocupado pelo terminador nulo (’\0’). Matrizes como Argumentos de Funções A idéia para Matrizes é similar. A primeira dimensão da matriz não precisa ser identificada, as outras devem ter seus valores iguais à definição. char func(int m[ ][10]) { ... } O espaço de memória (número de elementos da matriz) é definido pela função chamadora int m[10][20]; /* define uma matriz com 10x20 elementos */ ATENÇÃO: int m[10,20]; Ö a expressão 10,20 (operador “,”) resultará em 20, esta é uma definição unidimensional Dimensão igual a declaração da rotina chamadora – um ponteiro indicando o primeiro elemento do vetor Então, não é possível passar vetores por valor em parâmetros. char func(int v[ ]) { ... } char func(int *v) { ... } O espaço de memória (número de elementos do vetor) é definido pela função chamadora Funções para Manipular Cadeias de Caracteres char *strcpy(char *s1, char *s2); – copia a cadeia de caracteres s2 para a cadeia de caracteres s1 int strlen(char *s); – retorna número total de caracteres de s, exceto o caractere nulo char *strcat(char *s1, char *s2); – concatena a cadeia de caracteres s2 para o final de s1. int strcmp(char *s1, char *s2); – Compara duas cadeias de caracteres e retorna: • 0 se as duas forem iguais; • negativo se a primeira é menor; • positivo se a primeira é maior; Veja também as funções: – strcpy, strcat, strchr, strcmp, strcmpi, strcpy, strcspn, strdup, strerror, stricmp, strlen, strlwr, strncat, strncmp, strncmpi, strncpy, strnicmp, strnset, strpbrk, strrchr, strrev, strset, strspn, strstr, strtok e strupr 2 Implementações de Funções para Tratamento de Função strlen() Cadeias de Caracteres Cadeias de caracteres são vetores de char normais acrescidos do terminador (‘\0’) Diversas rotinas já estão implementadas no arquivo de cabeçalhos “string.h”. Retorna o comprimento de uma cadeia de caracteres Função strlen() Função strcmp() int strlen(char *str) { int i=0; while (*str++) i++; return i; } int strlen(char str[]) { char *p=str; while (*p) p++; return p-str; } int strlen(char str[]) { int i=0; while (str[i] != NULL) i++; return i; } int strlen(char str[]) { int i; i=0; while (*str != ‘\0’) { i++; str++; } return i; } Compara duas cadeias de caracteres – Retorna: 0 se são iguas >0 se a 1ª é maior <0 se a 1ª é menor int strcmp(char s1[], char s2[]) { int i=0; while (s1[i] == s2[i]) if (s1[i++] == 0) return 0; return s1[i] - s2[i]; } int strcmp(char *s1, char *s2) { for (; *s1 == *s2; s2++) if (*s1++ == 0) return 0; return *s1 - *s2; } Função strcpy() Copia uma cadeia de caracteres em outra char *strcpy(char s1[], char s2[]) { char i; for (i=0; s2[i] != 0; i++) s1[i] = s2[i]; s1[i]=0; return s1; } char *strcpy(char *s1, char *s2) { char *s=s1; while(*s1++ = *s2++) ; return s; } 3