Передача по ссылке структуры в процедуры или функции - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Правильно ли передавать структуру по ссылке так.
 typedef struct BigNum {
    int sign; // Знак числа, 1 или -1.
    int *data;
    size_t size;
} BigNum;
void BigNum_add(BigNum * bn1, BigNum * bn2) {
if (bn1->sign==bn2->sign) {
  .....
                                                }
else {
  ....
   BigNum_sub(bn1,bn2);
  ....
         };
                                                                }
void BigNum_sub(BigNum * bn1, BigNum * bn2)         {
.........
                                                                        }
из процедуры BigNum_add вызывается процедура BigNum_sub(bn1,bn2); которая внутри себя изменяет bn1.Параметр bn1 изменяется как внутри BigNum_add так и в BigNum_sub. Cледовало бы ожидать что измененное значение передастся в вызывающую процедуру BigNum_add и еще выше в вызывающую BigNum_addфункцию Но этого не происходит. Отладчик показывает что

вычисленное внутри BigNum_sub значение bn1 портится

. Хотя в варианте кодв с одноуровневым вызовом (т.е. когда в коде BigNum_add нет вызова процедуры BigNum_sub(bn1,bn2); в самый верх измененный в BigNum_add параметр bn1 отдично передается.

Почему?

Решение задачи: «Передача по ссылке структуры в процедуры или функции»

textual
Листинг программы
 int main(void)
{
   int ia=15;
   printf("main::isx ia=%d\n", ia);// Старое значения
   foo(&ia); // Попытка изменить значение
   printf("main::izm  ia=%d\n", ia);  // стало новое знач
   system("pause");
   return 0;
}

Объяснение кода листинга программы

  1. int main(void) - функция main, тип возвращаемого значения - int, режим вызова функции - void.
  2. int ia=15; - объявление переменной ia типа int со значением 15.
  3. printf(main::isx ia=%d\n, ia); - вывод значения переменной ia в консоль.
  4. foo(&ia); - вызов функции foo с передачей адреса переменной ia в качестве аргумента.
  5. printf(main::izm  ia=%d\n, ia); - вывод нового значения переменной ia в консоль.
  6. system(pause); - приостановка выполнения программы до нажатия клавиши.
  7. return 0; - завершение работы функции main.
  8. foo(ia); - передача значения переменной ia в функцию foo.
  9. printf(foo::isx ia=%d\n, ia); - вывод значения переменной ia в консоль.
  10. ia=20; - присвоение переменной ia новое значение.
  11. printf(foo::izm  ia=%d\n, ia); - вывод нового значения переменной ia в консоль.
  12. return ia; - возврат значения переменной ia из функции foo.
  13. printf(main::isx ia=%d\n, ia); - вывод значения переменной ia в консоль.
  14. printf(foo::isx ia=%d\n, ia); - вывод значения переменной ia в консоль.
  15. printf(foo::izm  ia=%d\n, ia); - вывод нового значения переменной ia в консоль.
  16. system(pause); - приостановка выполнения программы до нажатия клавиши.
  17. return 0; - завершение работы функции main.
  18. int main(void) - функция main, тип возвращаемого значения - int, режим вызова функции - void.
  19. int ia=15; - объявление переменной ia типа int со значением 15.
  20. printf(main::isx ia=%d\n, ia); - вывод значения переменной ia в консоль.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.5 из 5
Похожие ответы