EnzoFerber
(usa FreeBSD)
Enviado em 30/06/2006 - 22:50h
Cara, seguinte...
1.
"return *(p1 + 1); = incrementa o valor apontado por ponteiro p1 em um ou seu endereço?"
Os parentesis tem precedencia maior, ai o que vai acontecer: Vai acontecer um incremento de 1 no endereço de p1 e a função vai retornar o valor desse novo endereço (isso normalmente gera erro..)
2.
while(*s) putchar(*s++); = incrementa o endereço do ponteiro pois expressão é avaliada da direita p\ esquerda
Esse tipo de loop sempre me confundia... Bom, o que ele faz é o seguinte:
while(*s)
Leia iss o como: enquando houver um valor no endereço atual de S....
puts(*s++);
Como isso é uma função, é lido da Esquerda para direita, então ele vai imprimir o valor do endereço atual e incrementar esse endereço logo em seguida...
3.
str[4]; ou p1+4; = acessa o 5º elemento do vetor str
Essa é legal... :) Bom... se você fizer o seguinte: printf("%c", str[4]); e printf("%c", p1+4); certamente notará que os resultados apresentados serão diferente... Então é fácil concluir que o que você afirmou é ERRADO. str[4] acessa o valor do 4° endereço de str, e d1+4 é o proprio endereço do 4° endereço de str. Complicado? Para testar.. rode esse programa que tudo se esclarecerá...
************************
ponteiros.c
************************
#include <stdio.h>
int main(void){
char s[6]="Slack\n";
char *d;
d = s;
printf("%c\n", s[2]); // valor do endereço de s[2]
printf("%p\n", (d+2)); // endereço de s[2]
printf("%p\n", &s[2]); // endereço de s[2]
printf("%c\n", *(d+2)); // valor do endereço de s[2]
}
*********************
4.
str[4]; ou *(p1+4); = acessa o valor do 5º elemento do vetor str
Essa está está certa... :)
5.
int (*tab)[12]; = ponteiro p\ vetor tab de 12 int
int *tab[12]; = vetor tab de 12 ponteiros int
Ambos são ponteiros para vetores INT. Não há diferençãs.
6.
void (*options[ ]) (void)
Cara... até onde tudo que eu já estudei.. eu nunca vi alguem citar declaração de vetor de funções... vc pode declara ponteiros pra vetores, ou até funções do tipo ponteiro pra ponteiro... mas seria algo do tipo:
int **função(void){...}
Eu sinceramente nunca vi nenhum programa usar esse tipo de declaração... Se um dia você ver, me mande o link... :) (brincadeiras à parte)
7.
int (*comp) (void*, void*); = declara ponteiro *comp p\ função c\ 2 argumentos void e retorna int
(*comp) (v[j], v[esq]); = chamada à função apontada por *comp
Saca só, você não precisa fazer com funções o que voce faz com variáveis... O int *funcao() significa que o valor de retorno da função vai ser um ponteiro para int, e não que para acessá-la você tem que fazer como se fosse um ponteiro para int....
comp(&v[j],&v[esp);
Lembre-se: Você está passando ENDEREÇOS.. Mais uma coisa... num declara função com ponteiro pra void não cara... eles são realmente chatos quando a noção de ponteiros é menor que a do Dennis M. Ritchie ou do meu amigo Brian K. :)
Cara... qualquer dúvida... é so postar denovo...
Abraços,
Espero ter ajudado,
Slackware_10