指针数组发布ISO C ++禁止将字符串常量转换为'char'。

时间:2018-06-23 06:52:20

标签: c++ arrays pointers

在以下程序中,输出为BrownherAdamss。为什么没有正确的输出?与第二个程序一样,输出正确,因此对正在发生的事情感到困惑。两个程序都警告,但第二个程序运行良好。警告是ISO C ++禁止将字符串常量转换为'char'。 另外,如果我将指针数组声明为const,那么我将如何使用p [i] = client [i]。这让我很困惑。

第一个程序输出错误

#include<iostream>
using namespace std;
int main()
{
  char *a[40]={"Davis","Levine","Nelson"};
  char *client[10]={"Brown","Cohen","","","Fischer","Adams","","","Gibson"};
  char *p[10];
  int i;
  for(i=0;i<8;i++)
  {
    p[i]=client[i];
  }
  char *pt;
  int j=0;
  for(i=0;i<10;i++)
  {
    pt=p[i];
    while(*(pt+j)!='\0')
    {
      cout<<*(pt+j);
      j++;
    }
  }
  return 0;
}

输出正确的第二个程序

#include<iostream>
using namespace std;
int main()
{
  char *p[30]={"Hello","World","HELLO","WORLD"};
  int i,j;
  char *a;
  for(i=0;i<4;i++)
  {
    a=p[i];
    j=0;
    cout<<'\n';
    while(*(a+j)!='\0')
    {
      cout<<*(a+j);
      j++;
    }
  }
  return 0;
}

1 个答案:

答案 0 :(得分:0)

您不会在第一个程序中的每个字符串之间重置j。只需在j=0;之前添加while。为什么这样显示完全像编译器那样,因为这种行为是不确定的。

该警告是因为字符串文字"Brown"的类型为const char (&)[N],可以转换为const char*,而不是char*。如果将client定义为const char* client[10],则将获得所需的行为(与ap相同)。这样做会将它们定义为指向const char的指针数组。指针不是恒定的,只有字符是固定的,因此从client复制到p并不是问题。

顺便说一句,第一个程序中的client仅提供了9个值。取消引用client[9]将产生未定义的行为。