访问变量值而不在函数原型中声明它
Accessing variable value without declaring it in function prototype
在函数 read
中,我需要从 main
函数访问整数 a
和整数 b
的值,而无需在函数的原型中声明它们函数 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;
}
如何实现?
read
函数可以通过两种方式读取a
和b
的值或地址:
- 将它们作为参数传递
- 使
a
和 b
成为全球
所以如果你不想让它们成为参数,你需要将它们移到 main
函数之外和 read
函数之前。
另外,read
是一个系统函数的名字,所以你应该给它取个别的名字,以免与它冲突。
您已经收到了更常规的答案。对于您给定的限制,这是最合乎逻辑的选择。
但是 ...愚蠢的人为限制有时需要一个愚蠢的人为解决方案。
一种不太传统的方法是让函数理解值将以某种 non-standard 方式与数组指针一起传递。
例如,您可以创建两个额外的数组成员来表示 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;
在函数 read
中,我需要从 main
函数访问整数 a
和整数 b
的值,而无需在函数的原型中声明它们函数 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;
}
如何实现?
read
函数可以通过两种方式读取a
和b
的值或地址:
- 将它们作为参数传递
- 使
a
和b
成为全球
所以如果你不想让它们成为参数,你需要将它们移到 main
函数之外和 read
函数之前。
另外,read
是一个系统函数的名字,所以你应该给它取个别的名字,以免与它冲突。
您已经收到了更常规的答案。对于您给定的限制,这是最合乎逻辑的选择。
但是 ...愚蠢的人为限制有时需要一个愚蠢的人为解决方案。
一种不太传统的方法是让函数理解值将以某种 non-standard 方式与数组指针一起传递。
例如,您可以创建两个额外的数组成员来表示 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;