无法获得char指针以正确打印

时间:2015-09-19 02:21:57

标签: c++ arrays pointers char

我对指针比较新,慢慢学习如何使用它们。我在这里遇到了一个问题,我尝试了所有的选择。我有一个指针 char * pMonthName;指向monthName,这是一个char数组。我试图用cout<<打印出pMonth。 pMonthName;并得到垃圾和哔哔声。另外,我尝试通过使用cout<<取消引用pMonthName来打印pMonthName。 * pMonthName。这打印出垃圾,但更接近我需要的格式,但打印出来的个别字符是垃圾。任何人都可以弄明白我如何显示pMonthName?这是代码。

char monthName[12][15];

// initialize
strcpy_s(monthName[0], "january");
strcpy_s(monthName[1], "febuary");
strcpy_s(monthName[2], "march");
strcpy_s(monthName[3], "april");
strcpy_s(monthName[4], "may");
strcpy_s(monthName[5], "june");
strcpy_s(monthName[6], "july");
strcpy_s(monthName[7], "august");
strcpy_s(monthName[8], "septempber");
strcpy_s(monthName[9], "october");
strcpy_s(monthName[10], "november");
strcpy_s(monthName[11], "december");

// create a char pointer
char* pMonthName;

// make pointer point to the array
pMonthName = &monthName[12][15];

// print array using the pointer
for (row = 0; row < 12; row++)
{
    length = strlen(monthName[row]); 
    for (col = 0; col < length; col++)
    {
        cout << *pMonthName;
    }
    cout << endl;
}

1 个答案:

答案 0 :(得分:0)

首先,这是错误的,因为它无法编译:

strcpy_s(monthName[0], "january");
strcpy_s(monthName[1], "febuary");
strcpy_s(monthName[2], "march");
strcpy_s(monthName[3], "april");
strcpy_s(monthName[4], "may");
strcpy_s(monthName[5], "june");
strcpy_s(monthName[6], "july");
strcpy_s(monthName[7], "august");
strcpy_s(monthName[8], "septempber");
strcpy_s(monthName[9], "october");
strcpy_s(monthName[10], "november");
strcpy_s(monthName[11], "december");

我认为你错过了一个论点(中间的一个),它应该是15

即使这个代码要编译,这也是错误的:

pMonthName = &monthName[12][15];

为了描述这有什么问题,请考虑一个鸡蛋盒可以存储12个鸡蛋(egg_carton[0]egg_carton[11]之间),并指向第13个鸡蛋(egg_carton[12]

更糟糕的是,有些鸡蛋可以双色,这意味着你有egg_carton[0][0]egg_carton[0][1]来解决两个蛋黄......但是你指的是第三个​​ 第十三个蛋的蛋黄。

...然后你试图打印出那个不存在的蛋的不存在的蛋黄。

pMonthName不适合存储需要两级间接的东西,所以让我们从修复它开始。你肯定需要一个指向12 char s 的数组的指针(你可以解除引用两次,好像它是一个数组的数组),而不是只是指向char 指针(你只能解除引用一次,好像它只是一个数组),对吧?这种声明是这样写的:

char (*pMonthName)[12];

monthName的表达式将从数组(数组)类型的表达式转换为指针(到数组)类型的表达式。花一点时间来解读一下,也许在第二(和第三)时间读取它,然后再继续。

此规则有一些例外情况(例如,&address-ofsizeof运算符的操作数不会进行此转换。您需要了解这些转换将在您的代码中发生:

  • char[15]的表达式隐式变为char *
  • char[12][15]的表达式隐式变为char (*)[15]

因此,如果我们要写pMonthName = monthName;(或甚至是monthName[x]),那么monthNamechar[12][15])将转换为char (*)[15] 。然后,您就可以编写pMonthName[index_of_month],其等于monthName[index_of_month]

这是另一个例子:给定char *pMonthName;之类的声明,您可以分配地址一个月(而不是几个月的数组),如下所示:{{ 1}}和pMonthName = monthName[index_of_month];monthName[index_of_month])将在此表达式中隐式转换为char[15]