怎么理解int main(int argc, const char *argv[])
每次创建一个程序总会看到已经编写好的Hello World
程序(如下代码 0-1):
// 代码 0-1
#include<stdio.h>
int main(int argc, const char *argv[])
{
printf("Hello World!n");
return 0;
}
为什么自己编写的时候没有”int argc, const char *argv[]”,运行结果也是一样的呢?这是不是意味着参数”int argc, const char *argv[]”没有任何作用呢?接下来逐步分析:
(1)是不是真的没有作用呢?怎样排除特殊性呢?于是,我尝试用下面两个程序(如下代码 1-1,1-2)试一试:
// 代码 1-1
#include<stdio.h>
int main()
{
int tag;
printf("%dn", tag);
return 0;
}
// 代码 1-2
#include<stdio.h>
int main(int argc, const char *argv[])
{
int flag;
printf("%dn",flag);
return 0;
}
猜想:参数没有用,这两个结果是:一样的。
实践是检验真理的唯一标准,运行看看,结果:1606422582、0,这两个数完全不符合猜想,因此:int main(int argc, const char *argv[])中的参数是有作用的
为什么运行结果不一样呢?参数argc和argv[]是什么,起了什么作用呢?
(1)探求:argc和argv[]
下面代码在Mac环境进行编译运行代码 2-1(parameter.c)
// 代码 2-1
#include<stdio.h>
int main(int argc, char *argv[])
{
printf("%dn", argc);
while(argc){
printf("%sn", argv[--argc]);
}
return 0;
}
编译运行:
① 其中argc是指变量的个数,以例三为例:hello、a.out称为变量和./a.out程序运行的全路径名或程序的名字,argc即为3。 ② argv是一个char *的数组,其中存放指向参数变量的指针,此处argv[0]指向./a.out的全路径名,argv[1]指向hello,argv[2]指向a.out
下面验证一下小结的两个观点:
// 代码 2-2-1
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("numOfargc = %dnn", argc);
for(int j=0; j<argc; j++){
printf("argv[%d] = %sn", j, argv[j]);
}
}
// 代码 2-3-1
#include<stdio.h>
int main(int argc, char *argv[])
{
int i;//定义变量i
for(i=0; i<argc; i++){
printf("argv[%d] = %sn", i, argv[i]);
}
return 0;
}
// 代码 2-3-2
#include<stdio.h>
int main(int argc, const char *argv[])
{
printf("argc = %dn", argc);
for(int i = 0; i<(sizeof(argv)/sizeof(*argv)); i++){//①
printf("argv[%d] = %sn", i, argv[i]);
}
return 0;
}
① 修改可执行文件名进一步验证:
② 没有在终端输入变量情况下,打印argv默认值
// 代码 2-3-3
include<stdio.h>
int main(int argc, char *argv[])
{
printf("numOfArgc = %dnn", argc);
printf("numOfArgv = %lunn", sizeof(*argv));
for(int i = 0; i<=sizeof(*argv); i++){
printf("argv[%d] = %sn", i, argv[i]);
}
return 0;
}
③ 在终端输入变量
下面是看到的一道相关的题目:
【解析】
由上对于argc、argv[]详述可知:
- argv[0] 指向路径E:ex.exe
- argv[1] 指向字符串”abcd”
- argv[2] 指向字符串”efg”
- argv[3] 指向字符串”h3”
- argv[4] 指向字符串”k44”
因此,for 循环计算的是argv[1]、argv[3]两个字符串的长度和4+2=6,即选D
Hello World知多少
上图是从《程序员的自我修养》一书关于“Hello World”的一些问题,有兴趣的朋友可以看看
- angular之interceptors拦截器
- js list数据 转 树状 层级 JSON,递归生成树状 层级 JSON
- jquery 图片文件转base64 显示
- AngularJS 用 $http.jsonp 跨域SyntaxError问题
- 简单的java socket 示例
- Hadoop二次开发环境构建
- Android EditText 获得输入焦点 以及requestfocus()失效的问题
- 【直播】我的基因组68:看看哪些基因的突变较多,哪些较少
- GDI+编程
- GDI编程
- ADO访问数据库
- 【直播】我的基因组76:用krona对血液全基因组的菌比例可视化
- 【直播】我的基因组74:快速给测序reads比对到物种
- 用ADO操作数据库的方法步骤
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Day 4:重建二叉树
- python函数——字典设置默认值get() 与 setdefault()区别
- tensorflow学习笔记——0_零碎问题及解决笔记
- MapReduce工作笔记——Hadoop MR Streaming通用模板
- MapReduce工作笔记——Hadoop shell 常用文件操作命令
- Julia简易教程——4_字符串操作
- MapReduce工作笔记——Job上传普通文件和大文件
- MapReduce工作笔记——Streaming Job中jar包上传与使用指定
- MapReduce工作笔记——Job提交任务中-D和-jobconf的区别
- MapReduce工作笔记——Hadoop Streaming多目录/多路输入
- 矩阵操作试题(C++/Python)——矩阵元素顺时针旋转
- Linux实用技巧——paste横向合并文件内容
- Julia简易教程——5_函数
- 矩阵操作试题(C++/Python)——矩阵元素逆时针旋转90度
- MapReduce工作笔记——Streaming输入input解压