【悬赏】几个C语言初学的问题,求解,求解!谢谢

1、对于文件的打开操作,fopen,如果不定义指针FILE *fp。是否可以直接出现fopen(……);而不是fp=fopen(……);那么如果正常打开了,返回的文件的地址给谁,后面的操作这个地址是否能够存住?
2、dat文件可以存放文本文件吗?
3、extern是不是加上这个前缀,变量就成全局变量了?在整个程序里面都管用,而不是extern到程序末尾?extern定义的对象必须是前面用过的全局变量吗?
全局变量不就是管整个程序的吗,既然有定义过了,为什么还要用extern呢?求解
5、文件的写入读取函数,fscanf、fprintf以及fread和fwrite
fscanf(fp,"%d",&n);
fprintf(fp,"%d",n);

fwrite(&n,4,1,fp);
fread(&n,4,1,fp);

关于地址符&有点纠结,是不是如果是单个变量比如n、ch么得必须用&
(但是fprintf什么情况都不用)。如果是数组,比如str[N],num[N],这里不用写&了?谢谢
6、全局变量属于auto、static、register、extern中的哪一种?
7、对于字符数组,strcpy函数,比如str1[N]里面是"abcdefg",str2[N]里面是"qwe",
如果应用函数strcpy(str1,str2),那么是str1里面的内容全部都是qwe还是qwe\0efg?如果想把str2的数据全部覆盖到str1上(当然str1比str2大或等于)可以用这种方法吗?

谢谢

1、必须定义file *fp 或file fp。
2、dat文件可以存放文本文件。
3、extern之后就变成全局。可以一开始就extern,没有出现过也没有关系。
这个extern是最大的全局。不局限在两个文件之间。所有的文件都可以使用。一般的所谓全局变量作用域只是在自己的文件中。
5、&+普通变量表示地址,数组名就是地址,如果函数的形参是指针形式(即以地址形式传递参数),则需要&+普通变量或直接用数组名;如果函数的形参是非指针形式(即以值形式传递参数),直接用普通变量或数组名[ ];如果形参用的是int &x形式,则是以地址形式传递参数,但在调用函数时,只需要写入变量名而不需要在代入指针。(这样说可能不规范,但要好理解)。
6、对于这四个变量:http://wenku.baidu.com/view/1dcb340cf12d2af90242e63d.html 这个百度文库中对此做了详细解释。你可以参考下。两三句话可能说不明白。这儿简单说:
从变量值存在时间(生存期)角度分:静态存储方式和动态存储方式。
从变量的作用域(空间)角度分:全局变量和局部变量。
在用户区的存储空间:
|程序区 |
|静态存储区|
|动态存储器|
静态存储方式程序运行期间系统分配固定存储空间,动态存储方式根据需求动态分配存储空间。全局变量都存放于静态存储区,动态存储区主要包括:函数的形参,在函数调用时分配存储空间;自动变量(未加static声明的局部变量);函数调用时的现场保护和返回地址等。
变量和函数的属性包括数据类型和数据的存储类别,存储类别指数据在内存中存储方式(静态和动态),包含auto,static,register,extern四种。
Auto自动变量:函数中未加static的局部变量和形参都属于此类,调用函数时分配内存,函数结束时释放内存。一般隐藏auto默认为自动存储类别。我们程序都变量大多是自动变量。
Static变量:
局部变量:static声明的局部变量在函数调用结束后不释放存储空间,再次调用函数时该变量已经有值。其他函数时不能引用它的。Static局部变量时在编译赋初值,自动变量的初值是函数调用时赋的。所以局部变量不赋初始值的话static变量自动赋值0或在空字符。而自动变量的初值则是不确定的。最好不要直接使用。函数中需要保留上次调用时的值或者初始化之后变量只被引用而不改变的可以考虑用static局部变量,这样比较耗内存。
外部变量:(外部变量解释见extern外部变量),如果我们希望该外部变量只能在本文件内使用,而不能被其他文件引用可以在外部变量定义时加static声明。防止别人写的模块误用。
Register变量:动态和静态变量都是存放在内存中,程序中遇到该值时用控制器发指令将变量的值送到运算器中,需要存数再保存到内存中。如果频繁使用一个变量,比如一个函数体内的多次循环每次都引用该局部变量,我们则可以把局部变量的值放到CPU的寄存器中,叫寄存器变量。不需要多次到内存中存取提高效率。但是只能局部自动变量和形参可以做寄存器变量。在函数调用时占用一些寄存器,函数结束时释放。不同系统对register要求也不一样,比如对定义register变量个数,数据类型等限制,有的默认为自动变量处理。所以在程序一般也不用。
Extern外部变量:在函数外部定义的全局变量,作用域开始于变量定义,结束于程序文件的结束。我们可以extern来声明外部变量来扩展它的作用域。同一个文件内,extern声明之后就可以作用域扩大到声明处到文件结束。比如在一个函数之后定义外部变量a,之后的函数可以使用该变量,但是之前的函数不能使用,加extern可以解决。多个文件时,可以在未定义该外部变量的文件内做extern声明即可以使用。但是需要注意可能执行一个文件时改变了该全局变量的值,影响其他文件的调用。编译时遇到extern,会先在文件内找是否定义了该外部变量。如果未找到则在链接时在其他文件中找。

7、strcpy之后str1就和str2内容一样,但由于字符串碰到'\0'就认为是结束,所以说str1'\0'之前的和str2是一样的,之后的就无关紧要了。循环和输出的时候都是没有关系的,两个字符串长度也是一样的。
拿你题中例子来回就是strcpy之后 str1 = ”qwe\0efg",但是长度是3 ,输出也只是输出qwe。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-01
1、能,地址保存在fopen()本身的函数值上,指针只是接受了一个左值。
2、不能,bat是window脚本文件,记录的是命令。
3、4、extern表示扩展的意思,告诉你在其它地方已经定义了,声明在此文件中我要用了。
5、在这些函数接受的参数可以是变量值或者变量地址,用地址操作时用取地址符。
6、全局变量就是全局变量,与你说的auto、static等无关,static可以起到全局变量的作用,全局变量不一定用extern,全局是一个相对的概念。
7、自己编译一下不就看到结果了吗?本回答被网友采纳
第2个回答  2012-07-01
1、没有FILE *型的指针,怎么对文件进行其他操作,例如对文件的读写之类的。
2、dat文件可以是VCD文件,或加过密、或是其他文字,应该可以存放文本文件,你得通过一些软件实现。
3、你上百度百科上看看extern和全局变量,你就明白了。
5、假如你定义了一个int n,然后fscanf(fp,"%d",&n);是将其写到n所在的地址中,数组a[n],a本身是首地址,所以fscanf(fp,"%d",a);
6、全局变量在没有修饰符的情况下是extern的!
7、
 char * strcpy(char * strDest,const char * strSrc)

  {

  char * strDestCopy=strDest;

  if ((strDest==NULL)||(strSrc==NULL))

  throw "Invalid argument(s)";

  while ((*strDest++=*strSrc++)!='\0');

  return strDestCopy;

  }
注意
while ((*strDest++=*strSrc++)!='\0'); 在执行了(*strDest++=*strSrc++)才执行“!= '\0'”,也就是说他是先把'\0'复制过去才退出循环的,所以str1里面的内容全部都是qwe\0efg
你可以写个程序试试:
#include <stdio.h>
#include <string.h>
int main(void)
{
char strdst[5] = "abcd";
char strsrc[3] = "AA";
strcpy(strdst, strsrc);
printf("%s\n", strdst);//输出为AA
strdst[2] = 'Z';
printf("%s\n", strdst);//输出为AAZd
return 0;
}

以上仅供参考,有什么不对的地方你再参考其他资料 ,多练习一下程序,不会的时候改改程序,看看变化。
相似回答