unix c基础问题

AlenCheng 2014-08-19 10:57:44

int main(int argc, char* argv[]) {

printf("您输入的参数个数:%d\n",argc);
int i;
for (i = 0; i < argc; i++) {
printf("参数:%d,%s\n", i, argv[i]);
}
}

运行结果:
您输入的参数个数:1
参数:0,/home/ddc/workspace/function/Debug/function

问题如下:

我在获取指针数组的值时‘,为什么可以直接通过argv[i]这样来获取值呢?
而假如我通过 *(argv[i]) 获取,得到确实一个数值,这个数值代表的是什么呢?

您输入的参数个数:1
参数:0,47



希望各位前辈能帮忙解答下了,小弟谢过各位了。
...全文
304 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
inurlcn 2014-08-29
  • 打赏
  • 举报
回复
引用 12 楼 tinyFatAries 的回复:
[quote=引用 11 楼 inurlcn 的回复:] argv[0]和argv[1],C语言怎么知道到底地址要加多少呢?
argv[i]每个参出的最后都有一个'\0'字符表示结束 这和你声明一个 char str[] = "hello"会自动的在hello后面补一个'\0'一样 然后你就可以:printf("%s",str);[/quote] \0这个可以看到,但是就是C语法里面隐含的操作不明白,比如说 char a[]和double b[]相比较,a[i]和b[i]的内存跨度都不一样,不知道这是什么规则。
tinyFatAries 2014-08-27
  • 打赏
  • 举报
回复
引用 11 楼 inurlcn 的回复:
argv[0]和argv[1],C语言怎么知道到底地址要加多少呢?
argv[i]每个参出的最后都有一个'\0'字符表示结束 这和你声明一个 char str[] = "hello"会自动的在hello后面补一个'\0'一样 然后你就可以:printf("%s",str);
inurlcn 2014-08-27
  • 打赏
  • 举报
回复
引用 2 楼 tinyFatAries 的回复:
argv[i]中存储的是一个地址,比如你这个实际上打印的就是argv[0],也就时字符串中"/"这个字符的地址,printf格式化输出%s的时候,对应的参数就是字符串首地址,所以可以一直打印出整个字符串,一直到'\0'结束。 你用*(argv[0])相当于对argv[0]中存放的地址解指针,得出的结果应该是'/'这个字符,但是这时候不能再用%s了,你可以用%c试试就是这个结果。
argv[0]和argv[1],C语言怎么知道到底地址要加多少呢?
707wk 2014-08-27
  • 打赏
  • 举报
回复
引用 2 楼 tinyFatAries 的回复:
argv[i]中存储的是一个地址,比如你这个实际上打印的就是argv[0],也就时字符串中"/"这个字符的地址,printf格式化输出%s的时候,对应的参数就是字符串首地址,所以可以一直打印出整个字符串,一直到'\0'结束。 你用*(argv[0])相当于对argv[0]中存放的地址解指针,得出的结果应该是'/'这个字符,但是这时候不能再用%s了,你可以用%c试试就是这个结果。
+1
AlenCheng 2014-08-26
  • 打赏
  • 举报
回复
引用 6 楼 Windeal 的回复:
char* 在C里表示字符串,不是你说的指针数组。 你把argv[i]当成字符串就明白了。
char* 在c里面不是指针数组?不是,我有点晕了。 能否详细解释下呢? 那么char* c; 是字符串?不代表c是char类型的指针吗?
轮子学长 2014-08-26
  • 打赏
  • 举报
回复
char* 在C里表示字符串,不是你说的指针数组。 你把argv[i]当成字符串就明白了。
奔跑的路 2014-08-26
  • 打赏
  • 举报
回复
兄弟,看你写的程序,我想你还没有弄清楚ac和av的具体含义。 先说一下ac吧,比如你在调用时,输入了2个参数,那么ac的值是3,也许你认为是2了 argc表示参数的总个数,包括你输入的参数还有文件路径,便于理解,你把这个路径也看成一个参数吧 所以: argv[0] : 你存放程序的完整路径 argv[1] : 你输入的第一个参数 argv[2] : 你输入的第二个参数 现在就可以分析你的程序了,它说你输入的参数个数是1,说明你在调用程序的时候没有传参,只是./function 参数(0个参数) ,没有附加另外的参数。 接着你赋值i=0,使i<1 ,(ac==1),所以你打印出了argv[0],是你执行程序的完整路径名也就不奇怪了 补充一下,char *argv[ ]等效 char **argv, argv[]是char *类型,存放地址,具体的你看c语言的书吧,就不多讲了,谢谢。
inurlcn 2014-08-26
  • 打赏
  • 举报
回复
int main(int argc, char* argv[])
{

    printf("您输入的参数个数:%d\n",argc);
    int i;
    for (i = 0; i < argc; i++) {
        printf("参数:%d,%s\n", i, argv[i]);
    }
	
    for (i = 0; i < argc; i++) {
        printf("参数序号 在内存中的首地址 参数长度:%d,0x%4x,0x%x\n", i, argv[i],strlen(argv[i]));
    }

}
inurlcn 2014-08-26
  • 打赏
  • 举报
回复
引用 7 楼 ck199007081001 的回复:
[quote=引用 6 楼 Windeal 的回复:] char* 在C里表示字符串,不是你说的指针数组。 你把argv[i]当成字符串就明白了。
char* 在c里面不是指针数组?不是,我有点晕了。 能否详细解释下呢? 那么char* c; 是字符串?不代表c是char类型的指针吗?[/quote] char* argv[] 是一个指向数组的指针(这数组还是变长的?) argv[i]内部实现我也不懂,不过效果就是指向下一个字符串的指针 你可以debug一下 argv[i]的值是多少
tinyFatAries 2014-08-19
  • 打赏
  • 举报
回复
argv[i]中存储的是一个地址,比如你这个实际上打印的就是argv[0],也就时字符串中"/"这个字符的地址,printf格式化输出%s的时候,对应的参数就是字符串首地址,所以可以一直打印出整个字符串,一直到'\0'结束。 你用*(argv[0])相当于对argv[0]中存放的地址解指针,得出的结果应该是'/'这个字符,但是这时候不能再用%s了,你可以用%c试试就是这个结果。
  • 打赏
  • 举报
回复
C-FAQ 6 http://c-faq.com/aryptr/index.html Here you can find most of your questions regarding to pointer and array. Have fun with C!
百曉生 2014-08-19
  • 打赏
  • 举报
回复

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧