我知道“Ali”是一个有4个字符的字符数组:'A''''''No'
我想知道的是它的回报价值。
例如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数组。
我认为这就是答案。
答案 0 :(得分:0)
研究以下内容 - 也许会有所帮助:
#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]);
}
分享并享受。
答案 1 :(得分:0)
在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
成为指向const
(只读)char
的5个指针的数组。
至于为什么代码不适合你,这是因为你试图将它编译为C ++(你只在一个提交中提到)。 C ++是一种与C不同的语言,具有不同的规则。 (在C ++中允许转换但不推荐使用。)如果您想询问C ++,请发布一个带有C ++标记的新问题 - 并确保在问题正文中清楚地显示确切的错误消息,而不是埋没在评论。
答案 2 :(得分:-2)
C中的字符串是指向char
(= char *
)的指针。正如你所说,"foo"
的值是一个指针。您的第二个示例不起作用的原因是char *names[5]
是指向char *
(= char **
)的指针。它不是一个字符串,它是一个字符串数组,由于数组是指针,它是一个指向字符串的指针。由于字符串是字符的数组(=指针),因此它是指向char的指针。