#include <stdio.h>
int main(int argc, char *argv[]) {
printf("argc = %d\n", argc);
printf("argv[1] = %s\n", argv[1]);
printf("*argv[2] = %x\n", *argv[2]);
}
./commandline 123 abc
有人可以向我解释第三个printf声明的内容吗?并解释代码行正在做什么 - 我无法理解。
谢谢。
编辑:对不起,我的问题不是很清楚 - 我知道这是一个格式指令,但我对实际输出结果感到困惑。您将指针传递给第一个字符的地址 - 那么程序如何从字符中打印十六进制值?答案 0 :(得分:2)
在第三个printf
中,argv[2]
指向程序名称后面的第二个命令行参数。在这种情况下,它是&#34; abc&#34;。
所以*argv[2]
取消引用指针指向字符串中的第一个字符&#39; a&#39;。此语法与argv[2][0]
相同。
%x
格式说明符表示以十六进制格式打印其参数。它的论点是*argv[2]
,这是&#39; a&#39;。假设ASCII编码,该字符的ASCII值为97十进制或61十六进制。
所以第三个printf
输出&#34; 61&#34;。
答案 1 :(得分:0)
%x
输出无符号整数的十六进制表示。在这种情况下,argv[2]
参数中的第一个字符。
所以,如果你传递一封信,那就是&#39;作为您的参数,打印输出应该是该字符的十六进制表示,例如&#34; 61&#34;如果是ASCII编码。而且因为你只打印第一个字符,你会看到相同的#34; 61&#34;即使您的命令行参数是&#34; abc&#34;。
,也会打印出来答案 2 :(得分:-1)
argv
是命令行参数的序列:
argv[0] == "./commandline"
argv[1] == "123"
argv[2] == "abc"
每个参数都是一个字符串(char
的零终止数组)。
*argv[2]
相当于argv[2][0]
- 它的计算结果为argv[2]
的第一个字符,即'a'
(ASCII 97)。
表达式*argv[2]
的类型是char
- 因为printf
是一个可变函数,表达式的类型是&#34;提升&#34;从char
到int
。
%x
转换说明符采用unsigned int
参数,并将输出格式化为十六进制整数;因此,将97的ASCII值视为unsigned int
,输出为十六进制等效值 - 0x61
。