主题:如何获取字符串中一个字符的地址?
comprehension
[专家分:0] 发布于 2010-04-29 13:13:00
我初学c++,对于
string text[]={"Mary","Jack","Tom"};
如何获取text[1][1]的地址值?
回复列表 (共11个回复)
沙发
cxxcomp [专家分:2370] 发布于 2010-04-29 15:05:00
这里用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
请按任意键继续. . .
板凳
cxxcomp [专家分:2370] 发布于 2010-04-29 15:08:00
或者把string转为c style字符串,再用上述方法。一样的。
3 楼
comprehension [专家分:0] 发布于 2010-04-29 16:37:00
谢谢。你的意思是要用到c语言中的。能否提供一个c++语言写的程序?
还有string text[]很难实现吗?
4 楼
cxxcomp [专家分:2370] 发布于 2010-04-29 17:18:00
老大,恕我直言,你的意思.......我有点不明白。什么叫“C++语言写的程序”?你觉得C++和C的区别在哪里?
5 楼
comprehension [专家分:0] 发布于 2010-04-29 21:19:00
我刚学。头文件<iostream.h>,printf函数,,,---这些好像是c的风格。我其实就是想要如何实现string text[]中的text[1][1]的地址,采用 cout输出。。。
6 楼
雪光风剑 [专家分:27190] 发布于 2010-04-29 22:03:00
iostream.h其实已经是c++了,只不过是旧标准而已
string是对字符串的一种封装,本身就是为了避免对内存的过度使用进行的加工。你如果还想取地址,对于string类来说无疑是不太合适的,不符合其设计本意。你要取这个地址来做什么呢?
7 楼
cxxcomp [专家分:2370] 发布于 2010-04-29 22:53:00
从没写过这么蹩脚的程序,还是被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 楼
comprehension [专家分:0] 发布于 2010-04-30 08:28:00
谢谢了。我初学很多疑问,问题的来源是。。。char型和string型,以及char*和string*的输出,弄了我很长时间。我想找到其中的机理。我觉得关键的是字符型要取其地址,需要用到指针的指针。我一直弄不明白char*p="how"; cout<<p;会输出how的原因。现在想想就当是规定好了。
9 楼
comprehension [专家分:0] 发布于 2010-04-30 08:50:00
我看了一下核心是这个
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 楼
cxxcomp [专家分:2370] 发布于 2010-04-30 13:14:00
[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[][])的形式。
学编程不该这么学的。应该学着站在机器和人之间的位置考虑问题,站在人的位置有时会百思不得其解,只能当成规定,殊不知,哪里有凭空的规定呢。站在机器位置又会失去代码的艺术性,所以,学编程比较难,别打算一朝一夕就掌握它。:)
我来回复