正确的函数原型格式

时间:2010-04-04 17:28:17

标签: c pointers prototype arrays declaration

我正在使用以下声明写入文本文件:

void create_out_file(char file_name[],long double *z1){
    FILE *out;
    int i;

    if((out = fopen(file_name, "w+")) == NULL){
        fprintf(stderr, "***> Open error on output file %s", file_name);
        exit(-1);
    }

    for(i = 0; i < ARRAY_SIZE; i++)
    fprintf(out, "%.16Le\n", z1[i]);
    fclose(out);
}

其中z1是长度为ARRAY_SIZE的长双数组。调用函数是:

create_out_file("E:/first67/jz1.txt", z1);

我将原型定义为:

void create_out_file(char file_name[], long double z1[]);

我将它放在“int main”之前但是在预处理器指令之后。我的代码工作正常。

我正在考虑将原型设为

void create_out_file(char file_name[],long double *z1). 

这是对的吗? *z1将指向z1的第一个数组元素。

我的宣言和原型是否是良好的编程习惯?

非常感谢...

更新:为了使程序更通用,我将ARRAY_SiZE定义为:

const int ARRAY_SIZE = 11;

原型变为:

void create_out_file(const char *file_name, const long double *z1, size_t z_size)

被叫函数是:

create_out_file("/tmp/myname", z1, ARRAY_SIZE);

并在函数声明中

void create_out_file(const char *file_name, const long double *z1, size_t z_size)

FILE *out;
int i;
    if((out = fopen(file_name, "w+")) == NULL){
    fprintf(stderr, "***> Open error on output file %s", file_name);
    exit(-1);
    }


for(i = 0; i < z_size; i++)
fprintf(out, "%.16Le\n", z1[i]);
fclose(out);
}

这会有用吗?

新更新编译时,

for(i = 0; i < z_size; i++)
声明中的

,我收到警告::警告C4018:'&lt;' :签名/未签名不匹配

这里有什么问题?

...谢谢

最新消息:感谢Jonathan Leffler的工作正常

2 个答案:

答案 0 :(得分:1)

使用'const char file_name []'或'const char * file_name' - 您不会更改函数中的名称。

同样,使用'const long double * z1'或'const long double z1 []'。

函数原型中指针和数组表示法之间的选择在很大程度上是任意的。我几乎总是使用指针表示法 - 因为最终这是传递给函数的内容。有些人认为,如果要将指针用作数组,请使用数组表示法;这是一个非常合理的观点 - 但不是我使用的观点。

如果将数组大小传递给函数,则代码更通用:

void create_out_file(const char *file_name, const long double *z1, size_t z_size)
{
    ...
}

请注意,指针和数组表示法之间的选择对于全局变量不是任意的。这两者之间有很多不同之处:

extern char *something;
extern char  anotherthing[];

有人说有一个指针大小的内存位置,包含字符串的地址(大概)。另一个说有一个字符串,名字叫'anotherthing',其值是一个指针。这可能有点微妙 - 但差异至关重要。 'pointer == array'同构只适用于函数参数列表。

答案 1 :(得分:0)

声明:long double z1[]long double *z1完全相同。

  

* z1将指向z1

的第一个数组元素

是肯定的。 c中没有这样的实体数组。只有指针和一些瘦的语法糖才能访问它们[ ]