LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1028|回复: 9

main()前的数据类型有什么用?

[复制链接]
发表于 2003-12-16 14:26:12 | 显示全部楼层 |阅读模式
问几个小问题:
1.main()前面的数据类型有什么用?例如:int main() {}用和不用有什么区别?
2,main( int argc, char *argv[])里的两个变量为什么要在这里赋值,在main()
{
#在这里赋值不行吗?
}
我是新手,请尽量回答得详细点。谢谢~~
发表于 2003-12-16 14:33:09 | 显示全部楼层
1、C语言规定,main()函数的返回类型必须是int,完整的写法是:
int main (int argc, char *argv[])
{ return 0;}
如果你省略了前面的int,那么编译器(不知道是不是在预处理器中)会自动为其加上int。
2、只有定义,并没有赋值(要等到启动程序的时候,传递参数)。
 楼主| 发表于 2003-12-16 14:37:44 | 显示全部楼层
最初由 diver 发表
1、C语言规定,main()函数的返回类型必须是int,完整的写法是:
int main (int argc, char *argv[])
{ return 0;}
如果你省略了前面的int,那么编译器(不知道是不是在预处理器中)会自动为其加上int。
2、只有定义,并没有赋值(要等到启动程序的时候,传递参数)。


谢谢你的帮助~~那能在{}里面定义和赋值吗?在不在这里定义有什么不同,请再解释一下,先谢了~~
发表于 2003-12-16 15:06:31 | 显示全部楼层
argc 为你执行命令时所有的参数的个数,包括可执行文件
agrv[]为传递的参数,都是默认的了。
发表于 2003-12-17 09:30:33 | 显示全部楼层
argc和argv变量名称不是定死的,但是类型不能错,第一个是int,第二个是char **
发表于 2003-12-17 12:05:50 | 显示全部楼层
C++程序不过是操作系统调用的函数:(

比如我们使用mv命令:mv file.c file2.c,那么file.c和file2.c就是两个参数。因此,main()的第一行应为int main(int argc, char * argv[]),这种形式不是固定不变的,不能将参数改成其他类型。但由于数组的实质上是指针,所以第二个参数“char * argv[]”也可以表示成“char ** argv”。
至于可不可以在函数体内赋值?可以,不过没有什么意义。
发表于 2003-12-17 13:24:36 | 显示全部楼层
mian前面的 int 返回值是返回给系统调用程序的,表示程序的退出状态,在有的编译器实现上没有 int返回是编译通不过的
 楼主| 发表于 2003-12-17 13:59:14 | 显示全部楼层
谢谢大家的帮助。。。。。

不同意diver的这句话“但由于数组的实质上是指针,所以第二个参数“char * argv[]”也可以表示成“char ** argv”。”

**argv不是表示指针的指指吗?有两个*.但这个指针的指针不是数组。


还有个问题:
为什么一定要这两个数据类型,不要任何一个会怎么样?就这样不行吗?
int maint() { #在这里定义和赋值 }

我想这是很多新手疑惑的问题把,请再帮帮我。。。。
发表于 2003-12-17 16:04:29 | 显示全部楼层
char * argv[]和char ** argv都是对的
指针跟数组是吧一样,但是作为函数参数时,传递数组的真实元素是不现实的,
(数组太大时,你能保证被调用函数有足够大的栈祯吗?而且还浪费空间)
所以此时会退化为传址。

int argc, char * argv[]
这两个参数是用于命令行操作的,具体内容会由系统进行传递,你需要作的只是
提供这些命令行参数。
如:
rm -f /*
在rm函数体内就可以得到这样的结果:argc为3,argv为{"rm","-f","/*",NULL}
发表于 2003-12-17 17:50:06 | 显示全部楼层

回复home

> **argv不是表示指针的指指吗?有两个*.但这个指针的指针不是数组。

呵呵,我没有说“char * argv[]”是数组哦:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表