c中“”的确切返回值是多少?它是一个指针吗? [关闭]
Posted
技术标签:
【中文标题】c中“”的确切返回值是多少?它是一个指针吗? [关闭]【英文标题】:whats the exact return of value in " " in c? is it a pointer? [closed] 【发布时间】:2013-12-23 14:57:13 【问题描述】:我知道 "Ali" 是 4 个字符的 char 数组:'A' 'l' 'i' NULL
我想知道的是它的返回值。
例如 strcpy 需要两个指针作为输入。为什么下面的代码有效:
char mstr[10]=;
strcpy(mstr,"Working...");
但这不是:
char *names[5]="Ali","Reza","Hassan","Ahmad","Mohammad";
“Ali”是不是指向'A'字符的指针?!
问题已解决!!! (我不明白为什么?!我只是添加一些东西来打印它们!):
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
char mstr[10]=;
strcpy(mstr,"Working...");
char *names[5]="Ali","Reza","Hassan","Ahmad","Mohammad";
int i;
//print :
for(i=0;i<5;i++)
puts(names[i]);
getch();
return 0;
我想我知道这里发生了什么。我的第二个代码在 C 语言中完全正确。我将它编译为 c++ 文件(它是一个 cpp 文件)
顺便说一句,错误是:[错误] 从 'char' 到 'const char*' 的无效转换 [-fpermissive]
C++ 有不同的规则,默认情况下它定义了 5 个 const char 数组而不是 char 数组。
我认为这就是答案。
【问题讨论】:
“不工作”是什么意思?那应该编译得很好。 不,它根本不工作...... [错误] 从 'char' 到 'const char*' 的无效转换 [-fpermissive] 这里编译得很好:ideone.com/5mGMLH。请发帖minimal test-case。 再次,请发布您正在使用的确切代码。另外,请发布有关您的编译器版本以及如何调用它的详细信息。 关于"Ali"
是指向 'A'
的指针的查询 - 这取决于上下文。 "Ali"
本身是一个足以容纳四个元素的字符数组的文字声明,前三个初始化为'A', 'l', 'i'
,最后一个字符集为 NUL(注意:NUL,而不是 NULL)。如果在函数调用中使用此字面量,其中需要 char *
(例如 strcpy(name, "Ali");
),则编译器遵循以下规则:在预期指针的位置使用字面量数组声明会导致指向数组第一个元素的指针为传递给函数。
【参考方案1】:
在 C 中,此声明:
char *names[5]="Ali","Reza","Hassan","Ahmad","Mohammad";
完全合法,但有潜在危险。它将names
定义为一个由5 个char*
指针组成的数组,每个指针都指向字符串文字的第一个字符。问题是尝试修改字符串文字具有未定义的行为(由于历史原因,字符串文字不是const
)。因此,此声明允许您执行以下操作:
names[0][0] = 'E'; /* rename Ali to Eli? */
没有来自编译器的抱怨;它可能会在执行过程中崩溃。 (允许但不要求编译器对此发出警告。)
上面的应该写成:
const char *names[5]="Ali","Reza","Hassan","Ahmad","Mohammad";
这使得 names
成为一个包含 5 个指向 const
的指针的数组(只读)char
。
至于为什么代码不适合你,那是因为你试图将它编译为 C++(你只在评论中提到过)。 C++ 是与 C 不同的语言,具有不同的规则。 (在 C++ 中,允许转换但不推荐使用。)如果您想询问 C++,请使用 C++ 标签发布一个新问题——并确保在问题正文中清楚地显示确切的错误消息,而不是埋在评论。
【讨论】:
我得到了我想要的所有答案。 ty all :) 很抱歉在评论中对其进行了修正。 但仍不清楚您在问什么。我仍然会要求您更新您的问题,以明确您的问题,因此问题和答案可能对未来的读者更有用。【参考方案2】:研究以下内容 - 也许会有所帮助:
#include <stdio.h>
#include <strings.h>
int main(int argc, char **argv)
char mstr[11]; /* must be **11** elements in size to hold "Working..." */
char *names[5]="Ali","Reza","Hassan","Ahmad","Mohammad";
int i;
strcpy(mstr, "Working...");
printf("Print #1 - mstr='%s'\n", mstr);
for(i = 0 ; i < sizeof(names)/sizeof(names[0]) ; ++i)
printf("Print #2 - names[%d] = '%s'\n", i, names[i]);
分享和享受。
【讨论】:
【参考方案3】:C 中的字符串是指向 char
(= char *
) 的指针。正如您所说,"foo"
的值是一个指针。您的第二个示例不起作用的原因是 char *names[5]
是指向 char *
的指针(= char **
)。它不是字符串,而是字符串数组,由于数组是指针,所以它是指向字符串的指针。由于字符串是字符数组(= 指针),因此它是指向字符的指针。
【讨论】:
"foo"
的类型其实是char [4]
...
必须是指向指针的指针!它是一个字符串数组。
@user2933210 是的,printf()
和朋友不想要指针,他们想要字符指针。
char * names 是一个指针数组,每个指针都必须是字符串的开头。如果“foo”是指向“f”的指针,那么它必须工作!
char *names[5]
是一个由 5 个字符指针组成的数组的声明。但是,如果/当 names
单独使用时,C 规则即数组的名称本身会生成指向数组第一个元素的指针,因此 names
本身等同于 @987654333 @。分享和享受。以上是关于c中“”的确切返回值是多少?它是一个指针吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
c语言函数返回字符串时必须要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针?