是否可以在其范围之外使用指针表示法?
这是我的主要内容:
int main(){
int number[15];
readNumbers();
return 0;
}
这是我的readNumbers()函数:
void readNumbers() {
FILE *fp;
fp = fopen("/Users/Documents/testNumbers.txt", "r");
if (fp == NULL) {
printf("File could not be loaded!");
exit(0);
}
if (fp != NULL) {
int c;
while ((c = fgetc(fp)) != EOF) {
putchar(c);
}
fclose(fp);
}
return 0;
}
我试图让我的readNumbers()函数将testNumbers.txt中的数字添加到我的main(int* num[15]
)中类型为int的15的数组中。
这会有用吗?:
int num[15]; // This will be in the main
&安培;&安培;
numRef *ip; // This will be in the main also as a pointer variable declaration
然后在我的int c;
函数中代替readScores()
而不是这样?:
ip = int* num[15]; // The variable that will store the address of int in pointer variable
非常非常混淆指针表示法。帮助太棒了!谢谢!
答案 0 :(得分:1)
您无法直接访问其他功能中的变量。有三种方法可以做你想要的。只有第三个被普遍认为是一个好主意。
使数字数组全局化,以便可以从两个函数中使用它们:
int number[15];
int main() {
readNumbers(); // side effect: fills the global number array
// use the filled global number array here
return 0;
}
void readNumbers() { // side effect: fills the global number array
FILE *fp;
fp = fopen("/Users/Documents/testNumbers.txt", "r");
if (fp == NULL) {
printf("File could not be loaded!");
exit(0);
}
if (fp != NULL) {
int c;
while ((c = fgetc(fp)) != EOF) {
// fill the global numbers array with data
putchar(c);
}
fclose(fp);
}
return 0;
}
在readNumbers中声明一个静态数字数组并返回它:
int main() {
int* number = readNumbers();
// use the filled number array here
return 0;
}
int* readNumbers() {
static int number[15];
FILE *fp;
fp = fopen("/Users/Documents/testNumbers.txt", "r");
if (fp == NULL) {
printf("File could not be loaded!");
exit(0);
}
if (fp != NULL) {
int c;
while ((c = fgetc(fp)) != EOF) {
// fill the static numbers array with data
putchar(c);
}
fclose(fp);
}
return number;
}
将数组数组传递给readNumbers,以便填充:
int main() {
static int number[15];
readNumbers(number);
// use the filled number array here
return 0;
}
void readNumbers(int* number) {
FILE *fp;
fp = fopen("/Users/Documents/testNumbers.txt", "r");
if (fp == NULL) {
printf("File could not be loaded!");
exit(0);
}
if (fp != NULL) {
int c;
while ((c = fgetc(fp)) != EOF) {
// fill the passed in numbers array with data
putchar(c);
}
fclose(fp);
}
return 0;
}
答案 1 :(得分:0)
一种简单的方法是将指针传递给数字数组作为函数的参数:
int main(){
int number[15];
readNumbers(numbers, 15); //<======
return 0;
}
并在您的函数中使用此参数:
void readNumbers(int *ip, size_t ipmax) {
...
}
您可以在函数ip[xxx]
中使用它,就像它是一个数组一样。唯一的想法是它的大小在功能中是未知的。这就是我建议将大小作为额外参数传递的原因。
另一种方法是使用向量代替,并通过引用传递它:
vector<int> number(15); // a vector of 15 elements. it can increase further
readNumbers(numbers, 15); //<======
...
void readNumbers(vector<int> &v) { // the size if v.size()
...
}
答案 2 :(得分:0)
这是使用动态内存分配实现readnums
的方法;也就是说,调用者只是传递一个指针,当函数返回时,它将包含文件中的数字。这样,您就不需要对代码中的限制进行硬编码。
#define INITALLOC 16
#define STEP 8
typedef long ssize_t;
ssize_t readnums(FILE *fp, int **arr)
{
size_t i, nalloced; /* #ints read and #ints malloced, respectively */
int *tmp;
/* allocate INITALLOC ints on the heap. */
if ((*arr = malloc(INITALLOC * sizeof (int))) == NULL)
return -1;
nalloced = INITALLOC;
/* fscanf reads the next int. It returns 1 if an int was found */
for (i = 0; fscanf(fp, "%d", *arr + i) == 1; ++i)
if (i == nalloced - 1) { /* if we run out of space, alloc more */
/* store it in a temporary, otherwise previous data is lost on
failure */
if ((tmp = realloc(*arr, (nalloced += STEP)*sizeof(int)))==NULL)
return -1;
*arr = tmp;
}
/* return #ints read */
return i;
}
请注意,调用者必须释放内存:
int *arr;
if (readnums(fp, &arr) == -1)
fprintf(stderr, "Error\n");
else {
/* ... do stuff ... */
free(arr);
}