C 传递和指针

Posted

技术标签:

【中文标题】C 传递和指针【英文标题】:C passing and pointers 【发布时间】:2013-04-03 02:29:03 【问题描述】:

所以我正在编写这个程序,我不知道如何通过引用或值传递。我只需要将值从一个函数(processFile)传递给另一个函数(printReport)。任何有关如何执行此操作的帮助将不胜感激。

#include <stdio.h>
#include <stdlib.h>

void printInstructions();
int processFile(FILE *fileIn);
void printReport();

int main(void)

   FILE *fileIn;
   int words = 0,
        lines = 0,
        characters = 0,
        sentences = 0;

   printInstructions();

   fileIn = fopen("input09.txt", "r");

   if(fileIn == NULL)
      printf("\n\nERROR\n\n");

   processFile(fileIn);

   printReport(words, lines, characters, sentences);



void printInstructions()

   printf("\n  Program reads a file and returns the number of  \n");
   printf("lines, words, characters, and sentences in the file.\n\n");

   return;


int processFile(FILE *fileIn)

        int sentences = 0,
             words = 0,
             lines = 0,
             characters = 0,
             ch;

   while(ch != EOF)
   
            ch = fgetc(fileIn);

            if(ch == '\n' || ch == 60)
                    lines++;

            if(ch == '.')
                    sentences++;

            if(ch != '.' || ch != ' ' || ch != '\n')
                    characters++;

            if(ch == ' ')
                    words++;
   

   return 0;


void printReport()

   printf("This file contains NUMBER lines.\n");
   printf("This file contains NUMBER words.\n");
   printf("This file contains NUMBER    characters.\n");
   printf("This file contains NUMBER sentences.\n\n");

   return;

【问题讨论】:

【参考方案1】:

尝试改成这样:

int processFile(FILE *fileIn, int *sentences, int *words, int *lines, int *characters)

    int ch;
    ...

        if(ch == '\n' || ch == 60)
                *lines++;
    ...

int main(void)

    ...
    processFile(fileIn, &sentences, &words, &lines, &characters);
    ...

因此,在此更改中,函数processFile 现在按指针接收四个参数。当您访问这些参数时,使用(例如)*lines 来取消引用指针。

main() 中,当您调用processFile() 时,会将地址传递给您的参数。

希望这会有所帮助;我认为您想了解 C/C++ 中的参数传递(按值传递、按指针传递和按引用传递 - 您可能想在 Google 上了解这些术语)。

【讨论】:

【参考方案2】:

如果您想在函数中从 FILE 中读取数据,那么您已经做到了。

FILE *fileIn 指向堆栈上的某个内存块。基本上它是一个数字。当您将该“数字”传递给另一个函数时,您仍然指向同一事物,因此您可以编辑您所指向的内容。

但是,如果您使 fileIn 指向您函数中的其他内容。例如:fileIn = null; 您必须将 fileIn 作为双指针传递。它必须有 2 个 *,如下所示:void foo(FILE **bar)

【讨论】:

【参考方案3】:

你可以从定义一个数据结构开始,将给定句子的所有统计数据保存为

typedef struct stats 
    int words;
    int lines;
    int characters;
    int sentences;
stats;

在 main 中,您可以将这个数据结构的对象创建为

struct stats stats_obj;

要从processFile 中检索统计信息,您可以将对此对象的引用传递为

processFile(fileIn, &stats_obj);

processFile 中,在处理结束时,您可以将结果存储为

stats_obj->words = words;
stats_obj->lines = lines;
.........

processFile 返回后,您可以将相同的内容传递给 printReport,就像 printReport(stats_obj) 一样,并在此函数中将其打印为

void printReport(struct stats stats_obj)

    printf("This file contains %d lines.\n", stats_obj.lines);
    printf("This file contains %d words.\n" , stats_obj.words);
    printf("This file contains %d characters.\n", stats_obj.characters);
    printf("This file contains %d sentences.\n\n", stats_obj.sentences);

    return;

注意:始终建议检查fopen 的输出,因此您必须在fileIn = fopen("input09.txt", "r"); 之后插入NULL 检查fileIn

【讨论】:

【参考方案4】:

你可以这样做:

int main(void)

  ...
  int sentences = 0,
         words = 0,
         lines = 0,
         characters = 0,
         ch;

  processFile(fileIn, &words, &lines, &characters, &sentences);

  printReport(words, lines, characters, sentences);


int processFile(FILE *fileIn, int *pWords, int *pLines, 
                              int *pLines, int *pSentences)

       ...
       *pLines++;
       *pSentences++;
       *pCharacters++;
       *pWords++;

【讨论】:

以上是关于C 传递和指针的主要内容,如果未能解决你的问题,请参考以下文章

C语言的指针传递,指针的指针的问题,谁能帮我分析分析这个问题?

C 传递和指针

c语言 指针传参

为啥指针不能传递正确的值(C)?

在 C 和 Go 中传递指针而不是返回新变量?

ARM Neon 汇编器 + C 如何传递和使用指针数组