Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的argv函数和字符串作为地址_C_Arrays_String_Argv_Double Pointer - Fatal编程技术网

C语言中的argv函数和字符串作为地址

C语言中的argv函数和字符串作为地址,c,arrays,string,argv,double-pointer,C,Arrays,String,Argv,Double Pointer,问题。 为什么像“C编程”这样的字符串被编译成如下地址值 #include <stdio.h> void ShowAllString(int argc, char * argv[]) { int i; for(i=0; i<argc; i++) printf("%s \n", argv[i]); } int main(void) { char * str[3]={ "C Programming",

问题。 为什么像“C编程”这样的字符串被编译成如下地址值

 #include <stdio.h>

 void ShowAllString(int argc, char * argv[]) 
 {
     int i;
     for(i=0; i<argc; i++)
        printf("%s \n", argv[i]);
 }

 int main(void)
 {
     char * str[3]={
         "C Programming",
         "C++ Programming",
         "JAVA Programming"  };

    ShowAllString(3, str);
    return 0;
  }
#包括
void ShowAllString(int argc,char*argv[])
{
int i;

对于(i=0;i当数组名作为参数传递时,它将衰减为指针。在代码中,您有一个由3个指针组成的数组。因此,它将衰减为指向指针的指针。

在C中,
char[]
是一个指针,指向存储
字符数组的位置,一个接一个地存储在内存中。碰巧,这是存储字符串的好方法。在代码中,您正在创建一个包含3个指针的数组,指向
字符数组。第一个指针
str[0]
,指向
字符序列的位置存储在内存中,等等

(在日常英语中,人们通常将“字符序列”称为“字符串”,但从技术上讲,正如第一条注释正确指出的那样,这意味着
char[]
在定义上必须表示字符串,而实际上并非如此。)


将指向此指针数组的指针传递给函数,然后函数检索指向
char
(“字符串”)数组的指针,
printf
行使用这些指针获取字符串(char
数组)然后打印出来。

我不确定你到底在问什么?
char*
是一个字符串。你可以做
char*x=“asdf”
你的程序将把字符串“asdf”放在内存中的某个地方,并返回指向第一个字符的指针。@Porkbutts
char*
是一种类型。“string”是值的表示形式。您可以使用
char*
指向字符串,但该类型与术语“string”不是同义词。
char[]
是一种类型(至少是一种不完整的类型)。“string”是值的表示形式。您可以(并且应该在可能的情况下)使用
char[]
存储字符串,但该类型与术语“字符串”不是同义词.@modifiablelvalue您是对的,我试图改进我的答案以反映您的更正点。我想知道decays这个词最初是什么时候用来描述数组表达式到指针表达式的转换的。它有这样一个负面的含义,好像数组已经停止存在并正在崩溃……我不喜欢它。@mo可定义的左值:“衰变”在我记忆中就一直被用来描述这个过程。我不知道这是否是讨论词源的正确地方,但“衰变”是我所知道的这个过程唯一正确的术语,我不知道同义词。@DietrichEpp C标准使用“转换”一词,根据英语定义是“衰变”这似乎不正确。数组和所有对象一样,在其生命周期结束时可能会“衰退”。@modifiablelvalue:是的,它们是“转换的”,但“衰退”在这里更为具体。抱怨常见的、公认的术语“衰退”并不合适可能不会以正确的方式逗乐你,但你所有的抱怨都不会改变它是正确的、特定的术语这一事实。试着用谷歌搜索这个词,在你的查询中使用或不使用“衰退”一词,你就会明白我的意思。@DietrichEpp我用字典确定“衰退”的用法在这种情况下是不正确的。我相信,如果你问一位英语教授(比如我的搭档),他/她会同意:数组不会腐烂到指针。