В функции read мне нужно получить доступ к значениям целых чисел a и целых чисел b из функции main без объявления их в прототипе функции read, с помощью указателей. Указатель x должен указывать на целое число a, а указатель y должен указывать на целое число b.

#include <stdio.h>
void read(int zzz[], int n) {
    int *arr = zzz, *x=a,*y=b;
}
int main() {
    int a, b;
    scanf("%d", &a);
    scanf("%d", &b);
    return 0;
}

Как это можно реализовать?

0
codproe 4 Фев 2022 в 02:36

2 ответа

Функция read может считывать значения или адреса a и b двумя способами:

  • Передайте их как параметры
  • Сделать a и b глобальными

Поэтому, если вы не хотите делать их параметрами, вам нужно переместить их за пределы функции main и перед функцией read.

Кроме того, read — это имя системной функции, поэтому вы должны назвать ее как-нибудь по-другому, чтобы не конфликтовать с ней.

3
dbush 4 Фев 2022 в 02:38
Большое спасибо вам
 – 
codproe
4 Фев 2022 в 03:16

Вы уже получили более традиционный ответ. Это наиболее логичный выбор для данного ограничения.


Однако ... Глупые искусственные ограничения иногда заслуживают глупого надуманного решения в натуральной форме.

Менее традиционным способом было бы понять с помощью функции, что значения будут передаваться с указателем массива каким-то нестандартным способом.

Например, вы можете создать два дополнительных члена массива для представления a и b.

int array_for_my_read[array_size + 2];
/* instead of a and b, you use those extra array members */
...
int *x = zzz + n, *y = x + 1;

В качестве альтернативы вы можете создать специальную структуру, содержащую массив и указатели. Затем функция восстанавливает указатель на структуру из указателя массива.

struct extra_parameters {
    int *a;
    int *b;
    int zzz[zzz_size];
};
...
struct extra_parameters x;
int a, b;
x.a = &a;
x.b = &b;
read(x.zzz, zzz_size);
...
void *p = (char *)zzz - offsetof(struct extra_parameters, zzz);
struct extra_parameters *xp = p;
int *a = xp->a, *b = xp->b;
1
jxh 4 Фев 2022 в 02:58
Мы не знаем, что это глупое ограничение, это может быть проблема «потеря перевода». OP, возможно, попросили передать по ссылке, а не по значению (мы не знаем, намерен ли read изменить a и b), но не поняли, когда им это объяснили
 – 
pm100
4 Фев 2022 в 03:05
В OP явно упоминается без объявления этого в прототипе функции и с использованием указателей. Я думаю, что в «потерях перевода» вообще не упоминались бы какие-либо ограничения. (Что более типично и более утомительно, так как решения отвергаются, потому что ограничения не были упомянуты.)
 – 
jxh
4 Фев 2022 в 03:10
Ну, он говорит: «без объявления, с использованием указателей», что можно прочитать как «не используйте int x, используйте указатель». Если бы эта запятая была "или", я бы согласился
 – 
pm100
4 Фев 2022 в 03:12
Большое спасибо вам
 – 
codproe
4 Фев 2022 в 03:16