回 帖 发 新 帖 刷新版面

主题:如何获取字符串中一个字符的地址?

我初学c++,对于
 string text[]={"Mary","Jack","Tom"};
如何获取text[1][1]的地址值?

回复列表 (共11个回复)

沙发

这里用string不合适。如果想达到你说的这个目的,这么做:
[code=c]
#include <stdio.h>
#include <stdlib.h>

char* pstr[4] = {"Mary", "Jack", "Tom", "Linda"};

void print_addr(char** pstring)
{
    for (int ix = 0; ix < 4; ++ix)
    {
        int ii = 0;
        while (true)
        {
            if (pstring[ix][ii] == '\0')
            {
                puts("\n");
                break;
            }
            printf("%c:%#p  ",pstring[ix][ii], &pstring[ix][ii]);
            ii++;
        }
    }
}

int main()
{
    print_addr(pstr);

    system("pause");
}
[/code]
何止能获取text[1][1]的地址。运行结果如下:
M:0X00428018  a:0X00428019  r:0X0042801A  y:0X0042801B

J:0X00428020  a:0X00428021  c:0X00428022  k:0X00428023

T:0X00428028  o:0X00428029  m:0X0042802A

L:0X0042802C  i:0X0042802D  n:0X0042802E  d:0X0042802F  a:0X00428030

请按任意键继续. . .

板凳

或者把string转为c style字符串,再用上述方法。一样的。

3 楼


谢谢。你的意思是要用到c语言中的。能否提供一个c++语言写的程序?
还有string text[]很难实现吗?

4 楼

老大,恕我直言,你的意思.......我有点不明白。什么叫“C++语言写的程序”?你觉得C++和C的区别在哪里?

5 楼


我刚学。头文件<iostream.h>,printf函数,,,---这些好像是c的风格。我其实就是想要如何实现string text[]中的text[1][1]的地址,采用 cout输出。。。

6 楼

iostream.h其实已经是c++了,只不过是旧标准而已
string是对字符串的一种封装,本身就是为了避免对内存的过度使用进行的加工。你如果还想取地址,对于string类来说无疑是不太合适的,不符合其设计本意。你要取这个地址来做什么呢?

7 楼

从没写过这么蹩脚的程序,还是被LZ逼着按"C++"写了一遍。其实这么做多此一举的。代码不该这么设计。
[code=c]
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

string text[4] = {"Mary","Jack","Tom","Linda"};

void print_addr(char** pstring)
{
    for (int ix = 0; ix < 4; ++ix)
    {
        int ii = 0;
        while (true)
        {
            if (pstring[ix][ii] == '\0')
            {
                cout << endl;
                break;
            }
            cout << hex << "  0x" << reinterpret_cast<int>(&pstring[ix][ii]);
            ii++;
        }
    }
}

int main()
{
    char* pstr[4];
    int ix;
    for (ix = 0; ix < 4; ++ix)
    {
        pstr[ix] = new char [10];
        strcpy(pstr[ix], text[ix].c_str());
    }
    print_addr(pstr);
    for (ix = 0; ix < 4; ++ix)
    {
        delete [] pstr[ix];
    }
    
    system("pause");
}
[/code]

8 楼

谢谢了。我初学很多疑问,问题的来源是。。。char型和string型,以及char*和string*的输出,弄了我很长时间。我想找到其中的机理。我觉得关键的是字符型要取其地址,需要用到指针的指针。我一直弄不明白char*p="how";  cout<<p;会输出how的原因。现在想想就当是规定好了。

9 楼

我看了一下核心是这个
cout <<hex<<"0x"<<reinterpret_cast<int>(&text[0][i])<<endl;
如果不是字符型的数组。。。可以采用&直接取到数组元素的地址。而char型需要强制转换。
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

void main() {
    string text[]={"linda","howip","mack"};
    cout <<hex<<reinterpret_cast<int>(&text[0][1])<<endl;
}
这样取到的是其内存地址吗?

10 楼

[quote]我看了一下核心是这个
cout <<hex<<"0x"<<reinterpret_cast<int>(&text[0][i])<<endl;
如果不是字符型的数组。。。可以采用&直接取到数组元素的地址。而char型需要强制转换。
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

void main() {
    string text[]={"linda","howip","mack"};
    cout <<hex<<reinterpret_cast<int>(&text[0][1])<<endl;
}
这样取到的是其内存地址吗?[/quote]


你说的“核心”根本不是什么核心。我还可以变成这样的static_cast<void*>(&pstring[][])的形式。
学编程不该这么学的。应该学着站在机器和人之间的位置考虑问题,站在人的位置有时会百思不得其解,只能当成规定,殊不知,哪里有凭空的规定呢。站在机器位置又会失去代码的艺术性,所以,学编程比较难,别打算一朝一夕就掌握它。:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册