use*_*972 3 c c++ arrays pointers
我目前有很多字符数组,用英语存储简单的字符串以供显示.我也有指向这些字符数组的指针.
char helloAr[20] = "Hello";
char timeAr[20] = "Time";
char dogAr[20] = "Dog";
char* helloPtr = helloAr;
char* timePtr = timeAr;
char* dogPtr = dogAr;
Run Code Online (Sandbox Code Playgroud)
我正在添加更多不同语言的字符数组,首先是法语.
char helloArFr[20] = "Bonjour";
char timeArFr[20] = "temps";
char dogArFr[20] = "chien";
Run Code Online (Sandbox Code Playgroud)
如果用户选择法语,我计划更改所有指针(当前指向英文字符数组)指向的地址,因此它们现在指向法语字符数组.我假设我可以简单地为这些指针分配一个新的值来做到这一点,
helloPtr = helloArFr;
timePtr = timeArFr;
dogPtr = dogArFr;
Run Code Online (Sandbox Code Playgroud)
但是我的实际代码会有很多数组,所以我想用一个循环来做这个,而不是像上面那样的很多语句.
为此,我计划创建一个字符指针数组,指向我的字符数组的地址.
char* charArrAddresses [NUMBER_OF_TEXT_ARRAYS]=
{
&helloAr,
&timeAr,
&dogAr,
&helloArFr,
&timeArFr,
&dogArFr,
};
Run Code Online (Sandbox Code Playgroud)
我还计划将所有指针存储在一个数组中,以便我可以在我的单个语句中通过它们在数组中的位置来引用它们,但这是我需要一些帮助的地方,因为我不确定如何执行此操作.这样的事可能吗?
char ** langPtrs[NUMBER_OF_LANG_POINTERS]=
{
helloPtr,
timePtr,
dogPtr,
};
Run Code Online (Sandbox Code Playgroud)
在循环内的单个语句中,我将使用所选语言和char数组的数量来计算正确的索引charArrAddresses,X现在就调用它.我将使用我的循环(例如i)的值来索引我的langPtrs数组.所以在我的单身中想说些什么,
for(i = 0; i<NUMBER_OF_LANG_POINTERS; i++)
{
langPtrs[i]= charArrAddresses[X];
}
Run Code Online (Sandbox Code Playgroud)
我试图分配存储在索引中的字符数组的地址X的charArrAddresses指针在指数i中的langPtrs阵列.我只需要帮助确切地说明如何声明langPtrs数组以及如何编写上面的单个语句.
不是将所有语言的字符串放在一个数组中,而是创建一个字符串和语言的2D数组.如果您不打算修改任何这些字符串,则可以使它们成为字符串文字而不是数组.
enum langs {
LANG_ENGLISH,
LANG_FRENCH,
NUMBER_OF_LANGS
};
enum strings{
STR_HELLO,
STR_TIME,
STR_DOG,
NUMBER_OF_STRINGS
};
const char *langPtrs[NUMBER_OF_LANGS][NUMBER_OF_STRINGS]=
{
{ "Hello", "Time", "Dog" }
{ "Bonjour", "temps", "chien" }
};
Run Code Online (Sandbox Code Playgroud)
由于符号的值enum从0开始并且每个后续符号递增1,因此可以使用它们作为数组索引.每个的最后一个成员(enum与数组中的实际元素不对应)可以用作数组的大小.
因此,如果你想用法语打印"time"字符串,你可以使用:
printf("%s\n", langPtrs[LANG_FRENCH][STR_TIME]);
Run Code Online (Sandbox Code Playgroud)
如果要始终从"当前"语言中打印字符串,可以创建指向当前语言的子数组的指针:
const char **currentLang = langPtrs[LANG_FRENCH];
Run Code Online (Sandbox Code Playgroud)
然后你可以使用它:
printf("%s\n", currentLang[STR_TIME]);
Run Code Online (Sandbox Code Playgroud)
编辑:
如果你想保留helloPtr,, timePtr和dogPtr,并且你想根据当前语言设置它们,你可以将它们的地址放在另一个数组中:
const char **usedInClassesPtrs[NUMBER_OF_STRINGS] = {
&helloPtr,
&timePtr,
&dogPtr
}
Run Code Online (Sandbox Code Playgroud)
然后循环遍历数组,取消引用每个元素以提供您想要更改的实际指针,并根据当前语言为2D语言数组分配一个字符串,如下所示:
for (i=0; i<NUMBER_OF_STRINGS; i++) {
*usedInClassesPtrs[i] = langPtrs[currentLang][i];
}
Run Code Online (Sandbox Code Playgroud)