thinkabout Posted July 14, 2013 at 11:13 AM Report #518692 Posted July 14, 2013 at 11:13 AM Boas, Estou com dificuldade em compreender o b = a+c. #include <stdio.h> int ex0b(int * a, int * b) { int c = *a; printf("[ a-> %d, b-> %d, c-> %d ] \n",*a, *b, c); // [ a-> 1, b-> 2, c-> 1 ] *a = *b; printf("[ a-> %d, b-> %d, c-> %d ] \n",*a, *b, c); // [ a-> 2, b-> 2, c-> 1 ] *b = c; printf("[ a-> %d, b-> %d, c-> %d ] \n",*a, *b, c); // [ a-> 2, b-> 1, c-> 1 ] a = &c; printf("[ a-> %d, b-> %d, c-> %d ] \n",*a, *b, c); // [ a-> 1, b-> 1, c-> 1 ] b = a+c; printf("[ a-> %d, b-> %d, c-> %d ] \n",*a, *b, c); // [ a-> 1, b-> -858993460, c-> 1 ] } int main(){ int a =1, b=2, c=3; ex0b(&a,&b); printf("[%d,%d,%d] \n",a, b, c); // [2,1,3] return 0; }
pwseo Posted July 14, 2013 at 11:18 AM Report #518693 Posted July 14, 2013 at 11:18 AM (edited) Quando no exercício fazes b = a + c tens que ter em conta que a contém o endereço de c e não o valor de c (a = &c). O valor de b passa a ser esse valor do endereço +1*sizeof(*b) (ou seja, b aponta para o int a seguir a c; isto tem a ver com aritmética de apontadores). Valor de *b é o valor do inteiro adjacente a c (um valor aleatório). EDIT: Peço desculpa pela resposta apressada... Outros poderão aprofundar sobre o assunto. Edited July 14, 2013 at 12:55 PM by pwseo
KTachyon Posted July 14, 2013 at 09:54 PM Report #518748 Posted July 14, 2013 at 09:54 PM Antes de falar sobre a questão: - Como ex0b não retorna nada, o tipo de retorno devia ser void e não int. Relativamente à questão: Se fizeres um printf("[ a-> %d, b-> %d, c-> %d ] \n", a, b, c); // sem os * antes do b = a+c vais obter a resposta à tua pergunta (em conjunto com a informação que o @pwseo deu). Podes fazer outra experiência: for (int i = 0; i < 1.0; i++) { printf("a + %d (%d) -> %d\n", i, a + i, *(a+i)); } Obténs o endereço e o que esse endereço contém desde as posições a[0] até a[9]. Vais poder verificar que apesar de o i ser incrementado em 1, as posições de memória são incrementadas em 4 (que é o sizeof(int)) e que estás a ler parte da memória do teu programa sem teres referências para os dados. 1 Report “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now