Anda di halaman 1dari 4

15/Mar/2012

Alocao esttica de memria


Ao se declarar uma varivel qualquer, o
compilador deixa reservado um espao
suficiente na memria para armazen-la

VETORES E STRINGS

int a; // 4 bytes
float x; // 4 bytes
double y; // 8 bytes
char c; // 1 byte
char *c;

// 4 bytes

Alocao esttica de memria


Ao fazer a alocao esttica, apenas o espao
necessrio na memria reservado
O contedo de cada posio no alterado, e
portanto uma varivel apenas declarada pode
conter qualquer coisa
Inicializar as variveis, atribuindo valores,
antes do uso
Inclusive vetores, matrizes e strings

Vetores
A referncia a uma posio de um vetor indica
o clculo de uma posio de memria a partir
do incio do vetor
float x[1000];
// x[20] est na posio x + 20*sizeof(float)

Na verdade, o smbolo x um apontador para


o incio da regio de memria reservada para
o vetor

Vetores
Quando se declara um vetor, o valor entre
colchetes indica quantas vezes o espao de
memria necessrio para o tipo bsico ser
alocado
char v[100]; //

100 * sizeof(char) = 100 bytes

int v[100]; // 100 * sizeof(int) = 400 bytes


float vf[200]; // 200 * sizeof(float) = 800 bytes
double z[1000]; // 1000 * sizeof(double) = 8000 bytes

Pode-se utilizar: sizeof(v)


Pode ser utilizado para descobrir o tamanho de uma string?

Vetores
C NO AVISA NEM PRODUZ ERRO QUANDO O
LIMITE DE UM VETOR OU MATRIZ FOR
EXCEDIDO
float x[1000];
y = x[2000]; // no d erro, mas vai acessar
// uma parte inesperada da memria

Erro mais comum (runtime):


segmentation fault

responsabilidade do programador verificar


os limites, e garantir que no sejam excedidos

15/Mar/2012

Matrizes

Matrizes

= Vetores de mais de uma dimenso


Na verdade, a alocao na memria linear
Muda apenas o clculo da posio de
memria do elemento referenciado
int M[5][5];
...
M[0][0] = 15;
M[2][3] = 2; // posicao: M + (2*5 + 3)*sizeof(int)

char M[3][5];
v = M[1][4];

M[1][4]

M[1][4]

char *M;
M = (char *) malloc(3 * 5 * sizeof(char));
// acesso a linha i e coluna j em matriz l x c
// v = M[i * c + j]
v = M[1 * 5 + 4];

Strings
Um string um vetor do tipo char
Para manipulao do string, atribuindo e
recuperando valores, e realizando operaes
sobre ele (funes no string.h), importante
entender essa caracterstica
Quando o contedo de um string no ocupa
todo o espao disponvel, usa-se um caractere
\0 (ou NULL, cdigo ASCII 0) como
delimitador

Strings
Strings constantes aparecem no cdigo entre
aspas
printf(%s, Bom dia!);

O delimitador \0 est includo:

Tamanho da string:
size_t strlen(char *str);

Strings
No possvel fazer atribuies diretas para
strings
Usar a funo strcpy ou a funo strncpy

Strings
Tamanho da string (no conta o \0):
size_t strlen(char *str);
char s[10];
int tamanho;

char *strcpy(char *DST, char *SRC);


strcpy(s, Bom dia!\n);
tamanho = strlen(s);

// 9

tamanho = sizeof(s);

// 10 (No usar!)

15/Mar/2012

Strings
Na inicializao, pode-se usar o mesmo
recurso disponvel para vetores
char nome[] = {A, n, a, \0};

Strings
Como o nome do string representa o endereo
onde comea o string, possvel manipul-lo
diretamente
Cuidado!

Ou

Exemplo

char nome[] = Ana;

char nome[] = Alexandre;


printf(%s\n, nome + 3); // imprime xandre

Strings
Funes

Strings
Comparao de strings

strcat(s1, s2): concatena o s2 no s1 (s1 tem que


ter espao)
strcmp(s1, s2): retorna
< 0 se s1 menor que s2,
0 se s1 igual a s2
> 0 se s1 maior que s2 (ordem alfabtica)
A comparao entre strings tambm tem que ser feita
caractere a caractere,
No se pode usar s1==s2; isso s compara os endereos

char str1[] = "abcd";


char str2[] = "abcd";
int cmp;
cmp = strcmp(str1, str2);
str2[4] = e;
cmp = strcmp(str1, str2);
str2[4] = \0;
cmp = strcmp(str1, str2);

Strings

Strings

strtok: extrai tokens, substrings delimitados


strncat, strncmp, strncpy: idem aos anteriores,
mas especifica o nmero de caracteres que
sero considerados

char *strtok(char *str, char *delim);

Exemplo:
str = algumas palavras;
delim = \n;
token = strtok(str, delim);
printf(%s\n, token);

// stdout: algumas

token = strtok(NULL, delim);


printf(%s\n, token);

// stdout: palavras

// memria: str: algumas\0palavras\0

15/Mar/2012

Strings

Strings

Exemplo
int num = 0; char linha[256];
...
while (!feof(infile)) {
fgets(linha, 256, infile);
p1 = strtok(linha, " \n"); //delim: branco ou fim de linha
while ((p1 != NULL) && (!feof(infile)))
{
num++;
printf("%s\n", p1);
p1 = strtok(NULL, " \n");
}
}

Passagem de Parmetros
Em C++, parmetros para funo podem ser passados
por valor ou por referncia
Por valor: o parmetro formal (recebido no procedimento)
uma cpia do parmetro real (passado na chamada)
Por referncia: o parmetro formal (recebido no procedimento)
uma referncia para o parmetro real (passado na chamada)
As modificaes efetuadas acontecem no parmetro real

Em C s existe passagem por valor, logo deve-se


implementar a passagem por referncia utilizando-se
apontadores
Algoritmos e Estrutura de
Dados II

Vetores de strings podem ser criados


Exemplo
char DiaSemana[7][14] = {Domingo,
Segunda, Tera, Quarta,
Quinta, Sexta, Sabado};
...
printf(%s\n, DiaSemana[3]);

Passagem de Parmetros (C)


void SomaUm(int x, int *y)
{
x = x + 1;
*y = (*y) + 1;
printf("Funcao SomaUm: %d %d\n", x, *y);
}
1 1
int main()
{
int a=0, b=0;
SomaUm(a, &b);
printf("Programa principal: %d %d\n", a, b);
}
0 1

Algoritmos e Estrutura de
Dados II

Passagem de parmetros para o programa


Chamada: C:\> prog.exe arg1 arg2 arg3
Declarao completa da funo main
int main(int argc, char *argv[])

argc: nmero de parmetros passados na


linha de comando
argv: um vetor de argc strings
argv[0]: nome do programa
argv[1]: primeiro parmetro
argv[argc 1]: ltimo parmetro
argv[argc] sempre NULL

Anda mungkin juga menyukai