我对指针比较新,慢慢学习如何使用它们。我在这里遇到了一个问题,我尝试了所有的选择。我有一个指针 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;
}
答案 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-of
和sizeof
运算符的操作数不会进行此转换。您需要了解这些转换将在您的代码中发生:
char[15]
的表达式隐式变为char *
。char[12][15]
的表达式隐式变为char (*)[15]
。因此,如果我们要写pMonthName = monthName;
(或甚至是monthName[x]
),那么monthName
(char[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]
。