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



希望各位前辈能帮忙解答下了,小弟谢过各位了。
...全文
300 13 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
一、C语言自我YY1)、C语言是许多高级计算机语言的基础,学好C语言能更好的学习其他高级语言,为以后的学习打基础;往深学C语言的话那就是学到C在Linux里的应用,Linux十分强大。2)、C语言是一种计算机程序设计语言。具有高级语言的特点,又具有汇编语言的特点。C语言可作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。3)、应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。具体应用比如单片机以及嵌入式系统开发。4)、C语言是面向过程语言,C语言通过windows/linux平台下编译的,是直接运行在windows/linux平台下的,而XX始终是运行在他的虚拟机之上的;所以理论上C语言能做一些相对于比较底层的工作,像XX就不能编写Windows病毒。5)、如果要利用编程来做一些windows优化工作的话,建议还是利用C语言。C语言是目前世界上流行、使用最广泛的高级程序设计语言6、很多编译器,几乎所有操作系统Windows,Linux,Unix的大部分代码都是C,C在背后做了很多东西的,也许开发游戏用C++,安卓用XX更为合适,图形界面的用其他语言开发效率更高一些(因为他们封装了很多东西),但同样的原因导致略微接近底层的功能其他语言根本干不了!Windows的API都是按照C语言的格式给的,这也很能说明问题!嵌入式开发更是离不了C语言!纵观电脑发展几十年,C语无所不能呀!

23,110

社区成员

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

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