从包含地址字符串元素的指针数组的指针数组中获取字符串元素的地址

Posted

技术标签:

【中文标题】从包含地址字符串元素的指针数组的指针数组中获取字符串元素的地址【英文标题】:Getting the address of a string element from a pointer array which contains pointer arrays which contain the address string elements 【发布时间】:2018-11-20 17:48:22 【问题描述】:

'ptrArrMain' 是一个指针数组,包含两个指针数组(ptrArr1 和 ptrArr2)。我有一个字符串 ab = "ab"。 ab[1] 的地址(即“b”的地址)存储在元素 ptrArr1[1] 中。 ptrArr1[0](即“a”的地址)分配给 ptrArrMain[0]。

如何仅使用 ptrArrMain 数组获取 ab[1] 的地址?我不想使用任何 STL 或预编码函数。我正在做这个练习来增强我对指针的理解。谢谢。

int main()


    string ab = "ab";
    string cd = "cd";

    char **ptrArrMain = new char*[2];
    char **ptrArr1 = new char*[ab.length()];
    char **ptrArr2 = new char*[cd.length()];

    ptrArr1[0] = &ab[0];
    ptrArr1[1] = &ab[1];

    ptrArr2[0] = &cd[0];
    ptrArr2[1] = &cd[1];

    ptrArrMain[0] = ptrArr1[0];
    ptrArrMain[1] = ptrArr2[0];

    cout << &ab[1] << endl;

    //  TODO
    //  Get the address of ab[1] using 'ptrArrMain'. 
    //  Do not use any other array.*/


我认为这应该是可能的,因为 ptrArrMain[0] 包含“ab”的第一个元素的地址。有了“ab”的第一个元素的地址,我应该能够通过增加(或其他方式)在 ptrArrMain[0] 中的 ab[0] 的地址来获得 ab[1] 的地址。

【问题讨论】:

如果您不使用标准容器或算法,您就不是在使用 c++ 请注意,您使用的std::string(c++ 字符串类型)是标准库数据类型 【参考方案1】:

当我使用 using namespace std 指令运行您当前的代码并导入 iostreamstring 标准库时,我得到以下结果:

 > g++ test.cpp -o test
 > ./test
 b

这是为什么?好吧,如果您查看您的代码,您会注意到ab 的类型为std::string(这是一个标准库类型)。在文档中,我们发现在字符串上使用[] 运算符实际上是一个重载操作(即它调用一个方法),它返回一个reference to a char。 If you attempt to get the address of the reference, you get the reference itself,这就是为什么要打印b

如果你想获取底层字符串的地址,你应该使用C-style strings aka 字符数组。然后,您可以使用array subscripts or pointer arithmetic 访问底层数组。

    char ab[3] = "ab";
char cd[3] = "cd";

char **ptrArrMain = new char*[2];
char **ptrArr1 = new char*[strlen(ab)];
char **ptrArr2 = new char*[strlen(cd)];

ptrArr1[0] = &ab[0];
ptrArr1[1] = &ab[1];

ptrArr2[0] = &cd[0];
ptrArr2[1] = &cd[1];

ptrArrMain[0] = ptrArr1[0];
ptrArrMain[1] = ptrArr2[0];


cout << (void *)&ab[1]  << endl;
cout << (void *)(ptrArrMain[0] + 1) << endl;
cout << (void *)(*ptrArrMain + sizeof(char)) << endl;

这将输出 3 个相同的内存地址。

您还应该小心将字符串的地址打印为cout will interpret them as strings themselves。

【讨论】:

非常感谢!我应该提到我正在使用标准库中的“字符串”。看起来将字符串转换为 char 数组是我实验的方法。

以上是关于从包含地址字符串元素的指针数组的指针数组中获取字符串元素的地址的主要内容,如果未能解决你的问题,请参考以下文章

对使用字符指针变量和字符数组的讨论

字符串数组与字符指针的区别

指针系统学习5-对使用字符指针变量和字符数组的讨论

从字符串指针数组中删除一个元素

指针数组与指针变量

《C语言程序设计》指针