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