什么是c中“”的确切值?它是指针吗?

时间:2013-12-23 14:57:14

标签: c++ c string pointers

我知道“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数组。

我认为这就是答案。

3 个答案:

答案 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的指针。