我正在使用以下声明写入文本文件:
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的工作正常
答案 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中没有这样的实体数组。只有指针和一些瘦的语法糖才能访问它们[ ]
。