char指针数组

时间:2018-02-12 15:48:26

标签: c++ c arrays pointers

我正在查看一些我没写过的代码,希望能帮助理解它的一个元素。代码存储字符数组,创建指向这些数组的指针(指定数组地址的指针)。它看起来像然后创建一个数组来存储这些字符指针地址,我只想澄清我正在看的东西。我也很困惑在创建数组时使用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的地址?如果有人能用英语解释这个过程,那么我可以把它放在一边,这将是很棒的。这可能只是因为它已经过了漫长的一天,但它根本就不在我脑海里。

4 个答案:

答案 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]);