LINUX.ORG.RU

что это за конструкция (язык С)


0

0

#include <stdio.h>
                                                                                
void myfunc1(int *x){
  printf("x in myfunc1 before some math: %d\n",*x);
  int y=21;
  *x=y-*x;
  printf("x in myfunc1 after some math: %d\n",*x);
}
                                                                                
void myfunc(int *x){
  *x=*x+1;
  printf("x before myfunc1 : %d\n",*x);
  myfunc1(&*x);
  printf("x after myfunc1 : %d\n",*x);
}
                                                                                
int main(){
  int x=4;
  printf("x before myfunc and myfunc1: %d\n",x);
  myfunc(&x);
  printf("x after myfunc and myfunc1 : %d\n",x);
  myfunc(&x);
  printf("x after myfunc and myfunc1 : %d\n",x);
}

я могу myfunc1(&*x); вызвать только с аргументом "&*x", 
это, я так разумею, ссылка на указатель (который, в 
свою очередь является адресом переменной)? Корректно ли так
писать?

спасибо за ответ!
☆☆

> myfunc1(&*x);

А myfunc1(x)?

нафига разименовывать и брать снова адрес?

fura13 ★★★
()

По мне удобнее так :
void myfunc ( int &x )
{
   <...>
}

int main
{
    myfunc ( x );
}

fura13 ★★★
()

>я могу myfunc1(&*x); вызвать только с аргументом "&*x", это, я так разумею, ссылка на указатель (который, в свою очередь является адресом переменной)? Корректно ли так писать?

Как уже сказали, так писать можно, но в Си (не в С++) бессмысленно. Это "адрес объекта, на который указывает x", т.е. x и есть.

anonymous
()
Ответ на: комментарий от anonymous

а как еще можно вызвать функцию myfunc, а из неё другую myfunc1, из 
которой надо потом в первую вызвавшую вернуть результат в самую первую main()

если я напишу так:

#include <stdio.h>
                                                                                
void myfunc1(int *x){
  printf("x in myfunc1 before some math: %d\n",*x);
  int y=21;
  *x=y-*x;
  printf("x in myfunc1 after some math: %d\n",*x);
}
                                                                                
void myfunc(int *x){
  *x=*x+1;
  printf("x before myfunc1 : %d\n",*x);
  myfunc1(&x);
  printf("x after myfunc1 : %d\n",*x);
}
                                                                                
int main(){
  int x=4;
  printf("x before myfunc and myfunc1: %d\n",x);
  myfunc(&x);
  printf("x after myfunc and myfunc1 : %d\n",x);
}

то на выходе  для *x получу:

[vilfred@observ contur 08:53:50]$ rm a.out;gcc test.c ;./a.out
test.c: In function `myfunc':
test.c:13: warning: passing arg 1 of `myfunc1' from incompatible pointer type
x before myfunc and myfunc1: 4
x before myfunc1 : 5
x in myfunc1 before some math: -1073748332
x in myfunc1 after some math: 1073748353
x after myfunc1 : -1979711539
x after myfunc and myfunc1 : 5
[vilfred@observ contur 08:53:56]$

Т.е. при таком перевыхове - непонятно что получается. А мне надо из 
myfunc (вообще она рекурсивная) вызывать myfunc1 с параметром каким-то. не выходит иначе то кроме как &*x

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

почему функции имеют тип void, потому что из этих функций хочется вернуть более одного значения.

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

вызов должен быть таким:

void myfunc(int *x){
  *x=*x+1;
  printf("x before myfunc1 : %d\n",*x);
  myfunc1(x);
^^^^^^^^^^^^^^^^
  printf("x after myfunc1 : %d\n",*x);
}



Dead ★★★★
()
Ответ на: комментарий от Dead

>А в C уже появились ссылки?

>Dead (*) (03.10.2005 12:36:25)

А где ты увидел ссылки дорогой?
Если ты имеешь в виду '&' - то это опреация взятия адресса.

kitov ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.