我正在查看一些我没写过的代码,希望能帮助理解它的一个元素。代码存储字符数组,创建指向这些数组的指针(指定数组地址的指针)。它看起来像然后创建一个数组来存储这些字符指针地址,我只想澄清我正在看的东西。我也很困惑在创建数组时使用double(**)。
我已经在下面列出了我正在查看的内容的简化示例。
char eLangAr[20] = "English";
char fLangAr[20] = "French";
char gLangAr[20] = "German";
char* eLangPtr = eLangAr;
char* fLangPtr = fLangAr;
char* gLangPtr = gLangAr;
char **langStrings [3]=
{
&eLangPtr,
&fLangPtr,
&gLangPtr
};
使用数组时,它们将它作为参数传递给函数。
menu (*langStrings[0]);
所以这个想法就是字符数组值"英语"传递给函数,但我很难看到如何。它们将菜单函数传递给存储在位置0的langStrings函数中的值的副本,这将是eLandPtr的地址?如果有人能用英语解释这个过程,那么我可以把它放在一边,这将是很棒的。这可能只是因为它已经过了漫长的一天,但它根本就不在我脑海里。
答案 0 :(得分:4)
你是正确的langStrings
包含指向字符数组指针的指针。所以每个langString[i]
指向一个指针。该指针指向一个数组。该数组包含一种语言的名称。
正如其他人指出的那样,它看起来有点笨拙。我将详细说明:
char eLangAr[20] = "English";
是一个包含20个字符的数组,名称为" English
"被复制到它。我不希望变量eLangAr
包含除此语言名称之外的其他内容,因此不需要使用数组;一个常数就足够了。
char **langStrings [3]= ...
在这里,只有一个间接(一个*)就足够了,因为似乎没有必要让指针指向任何其他东西(随机混乱语言?)。
总之,只要有以下内容就足够了:
const char *langStrings [3]=
{
"English",
"French",
"German"
};
(注意const
,因为字符串现在是只读常量/文字。)
<小时/> 给定代码可能有用的是当这些语言名称在不同语言中拼写不同时。所以 &#34;英语&#34 ;, &#34;法国&#34 ;, &#34;德国&#34;成为&#34; Engels&#34;,&#34; Frans&#34;,&#34; Duits&#34;。但是,那么仍有一个间接层次太多,以下就足够了:
char *langStrings [3]=
{
aLangArr,
fLangAr,
gLangAr
};
答案 1 :(得分:1)
好的,这里有。 ** ptrToptr表示法指向指针的指针。最简单的思考方式是作为2D矩阵 - 取消引用一个指针将整个矩阵解析为矩阵中的一条线。在此之后取消引用第二个指针将在矩阵中给出一个值。
此声明:
char eLangAr[20] = "English";
声明一个长度为20的数组,类型为char,它包含字符&#39; E&#39;&#39; n&#39;,&#39; g&#39;,&#39; l&# 39;,&#39;我&#39; s&#39;&#39; h&#39; &#39; \ 0&#39; 所以它(可能)是null终止但不是满的(最后有一些空字符)。您可以使用以下命令设置指向它开头的指针:
char* englishPtr = &eLangAr[0]
如果您取消引用englishPtr,它会给出值&#39; E&#39;。 这个指针:
char* eLangPtr = eLangAr;
指向数组本身(不一定是第一个值)。
如果你看一下
*langStrings[0]
您将看到它意味着langStrings [0]中指针的内容(解除引用*)。 langStrings [0]是eLangPtr的地址,因此取消引用它会给eLangPtr。 eLangPtr是指向数组eLangAr的指针(包含&#34;英语&#34;)。
我想这个函数想要能够写入eLangAr,所以让它指向一个不同的单词而不覆盖&#34;英语&#34;本身。它可能只是在内存中覆盖了字符本身,但我想它希望保持这些字的安全。
答案 2 :(得分:0)
**表示指向指针的指针。当你必须为另一个指针存储指针时使用它。
eLangPtr的值将指向eLangAr,其值为“English”
答案 3 :(得分:0)
下面:
char eLangAr[20] = "English";
创建一个数组。它的容量为20 char
s,包含8个字符 - 单词“English”并终止NULL字符。由于它是一个数组,它可以在预期指针的上下文中使用 - 这要归功于数组到指针的衰减,它将构造一个指向数组第一个元素的指针。这是在这里完成的:
char* eLangPtr = eLangAr;
与以下内容相同:
char* eLangPtr = &eLangAr[0]; // explicitly get the address of the first element
现在,虽然char*
表示指向字符的指针(这意味着它指向单个char
),但char**
表示指向char*
指针的指针。 / p>
区别:
char text[] = "Text";
char* chPointer = &ch[0];
char** chPointerPointer = &chPointer; // get the address of the pointer
std::cout << chPointer; // prints the address of 'text' array
std::cout << *chPointer; // prints the first character in 'text' array ('T')
std::cout << chPointerPointer; // prints the address of 'chPointer'
std::cout << *chPointerPointer; // prints the value of 'chPointer' which is the address of 'text' array
std::cout << *(*chPointerPointer); // prints the first character in 'text' array ('T')
正如您所看到的,它只是一个额外的间接层。
使用指针的指针也是出于同样的原因使用“第一级”指针 - 它们允许您获取指针的地址并将其传递给可能向其写入内容的函数,修改原始内容指针。
在这种情况下不需要,这就足够了:
const char *langStrings [3]=
{
eLangPtr,
fLangPtr,
gLangPtr
};
然后:
menu (langStrings[0]);