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