为什么我们不需要取消引用命令行参数(简单)

时间:2017-03-21 10:25:43

标签: c pointers

当我们从命令行获取参数时,如下所示:

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

我的理解是argv是一个指针数组的指针,它指向传入的参数的地址。

由于这种情况,为什么我们可以使用

访问commnand line参数
argv[i]

没有解除引用它,因为它包含指针?

2 个答案:

答案 0 :(得分:2)

您忘记了通过它的起始地址访问字符串(char *),而不是绝对值...您为字符串存储的值是多少?通用' 字符串'应该有多少内存?类型使用,因此' 字符串'是

C中的字符串由许多可打印字符组成,以nul(\0)结尾。这些都存储在内存中。

char *argv[]参数指定存在char *个元素的数组。如上所述,char *是一个字符串(或char元素数组)。

char *argv[]参数可以合法地声明为char **argv

例如,您可以打印字符串中每个字符的绝对值及其在内存中的地址:

#include <stdio.h>

int main(void) {
    char *my_string = "Hello World";
    int i;

    for (i = 0; my_string[i] != '\0'; i++) {
        printf("%c - 0x%02hhX - %p\n", my_string[i], my_string[i], &(my_string[i]));
    }

    return 0;
}

在这里,我们使用my_string[i]解除引用指针以获取单个字符。

输出:

H - 0x48 - 0x400614
e - 0x65 - 0x400615
l - 0x6C - 0x400616
l - 0x6C - 0x400617
o - 0x6F - 0x400618
  - 0x20 - 0x400619
W - 0x57 - 0x40061a
o - 0x6F - 0x40061b
r - 0x72 - 0x40061c
l - 0x6C - 0x40061d
d - 0x64 - 0x40061e

你可以像这样同时实现这个程序(注意解除引用):

#include <stdio.h>

int main(void) {
    char *my_string = "Hello World";
    char *s;

    /* s = my_string
     * is equivelant to:
     * s = &(my_string[0]) */

    for (s = my_string; *s != '\0'; s++) {
        printf("%c - 0x%02hhX - %p\n", *s, *s, s);
    }

    return 0;
}

答案 1 :(得分:1)

在main函数中: int argcchar *argv[]数组指向的字符串数

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

int argc:

  

int argc定义main函数中传递的字符串数。

char * argv []:

  

char *argv[]存储此数组中的每个单词/参数。

示例:

#include <stdio.h>
int main(int argc, char const *argv[]){
  for(int i=0; i<argc; i++){
    printf("%s\n", argv[i]);
  }
  return 0;
}

编译:

  

gcc -o c example.c

运行:

  

./ c一二有五四

输出

./c
one
two
there
four
five