Parte 2

Propaganda
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
Download