C++ 指向int类型的指针不';t在C+中正确合作+;

C++ 指向int类型的指针不';t在C+中正确合作+;,c++,string,pointers,C++,String,Pointers,我现在在谷歌上搜索了很多,但我仍然找不到任何解决方案。。。问题是,我正在尝试制作一个程序,在坐标系中存储不同的点,并在屏幕上显示它们(稍后它会变成一种图形,但我还不太清楚)。但不幸的是,我在这方面遇到了一些问题… 我决定将所有点存储在地址中,每个点后面都有一个字符串类型,如下所示: string p; string * pointer = &p; p = "5, 3"; *(&p+1) = "6, 4"; *(&p+2) = "7, 5"; cout << *

我现在在谷歌上搜索了很多,但我仍然找不到任何解决方案。。。问题是,我正在尝试制作一个程序,在坐标系中存储不同的点,并在屏幕上显示它们(稍后它会变成一种图形,但我还不太清楚)。但不幸的是,我在这方面遇到了一些问题…
我决定将所有点存储在地址中,每个点后面都有一个字符串类型,如下所示:

string p;
string * pointer = &p;
p = "5, 3";
*(&p+1) = "6, 4";
*(&p+2) = "7, 5";
cout << *pointer << *(pointer+1) << *(pointer+2);
显然这不起作用…
我开始怀疑这与指针指向字符串类型的地址有关,该地址由字符数组组成,但我不知道为什么,也不知道如何。。。如果现在是这样,为什么甚至可以使用字符串指针呢


无论如何,任何解决方案/解释都是值得赞赏的,真的。我过去没有太多使用指针,所以如果我遗漏了一些明显的东西,请原谅。但是如前所述,我已经尝试过搜索这个,但是我找不到任何东西。

您的第一个代码甚至无法编译

第二个代码尝试将值存储到
std::string
对象中,这些对象可能位于内存中
p
之后。但是在内存中的
p
之后没有
std::string
对象。任何将任何东西“存储”到这些不存在的对象中的尝试都会导致未定义的行为

如果将
p
声明为数组

string p[3];
string * pointer = p;

*pointer = "5, 3";     // same as `p[0] = "5, 3"`
*(pointer+1) = "6, 4"; // same as `p[1] = "6, 4"`
*(pointer+2) = "7, 5"; // same as `p[2] = "7, 5"`

cout << *pointer << *(pointer+1) << *(pointer+2);
字符串p[3];
字符串*指针=p;
*指针=“5,3”;//与'p[0]=“5,3”相同`
*(指针+1)=“6,4”;//与'p[1]=“6,4”相同`
*(指针+2)=“7,5”//与'p[2]=“7,5”相同`

cout您的第一个代码甚至无法编译

第二个代码尝试将值存储到
std::string
对象中,这些对象可能位于内存中
p
之后。但是在内存中的
p
之后没有
std::string
对象。任何将任何东西“存储”到这些不存在的对象中的尝试都会导致未定义的行为

如果将
p
声明为数组

string p[3];
string * pointer = p;

*pointer = "5, 3";     // same as `p[0] = "5, 3"`
*(pointer+1) = "6, 4"; // same as `p[1] = "6, 4"`
*(pointer+2) = "7, 5"; // same as `p[2] = "7, 5"`

cout << *pointer << *(pointer+1) << *(pointer+2);
字符串p[3];
字符串*指针=p;
*指针=“5,3”;//与'p[0]=“5,3”相同`
*(指针+1)=“6,4”;//与'p[1]=“6,4”相同`
*(指针+2)=“7,5”//与'p[2]=“7,5”相同`

你为什么不干脆这样做呢:

string p1 = "5, 3";
string p2 = "6, 4";
string p3 = "7, 5";
cout << p1 << p2 << p3;
string p1=“5,3”;
字符串p2=“6,4”;
字符串p3=“7,5”;

你为什么不干脆这样做呢:

string p1 = "5, 3";
string p2 = "6, 4";
string p3 = "7, 5";
cout << p1 << p2 << p3;
string p1=“5,3”;
字符串p2=“6,4”;
字符串p3=“7,5”;

不能不要使用指针,它们很难,而且你对它们的工作原理有一些严重的(奇怪的)误解。只需要使用一个向量

#include <vector>

struct Point
{
    Point(int xx, int yy) : x(xx), y(yy) {}
    int x;
    int y;
};

std::vector<Point> p;

p.push_back(Point(5,3));
p.push_back(Point(6,4));
p.push_back(Point(7,5));
#包括
结构点
{
点(intxx,intyy):x(xx),y(yy){
int x;
int-y;
};
std::向量p;
p、 向后推(点(5,3));
p、 向后推(点(6,4));
p、 向后推(点(7,5));

我定义了一个简单的
Point
类,因为如果您正在编写一个关于Point的程序,这似乎也是合理的。但是,如果您真的想将点存储为字符串,那么请将
std::vector
替换为
std::vector

不要使用指针,它们很难使用,而且您对它们的工作方式有一些严重(奇怪)的误解。只需要使用一个向量

#include <vector>

struct Point
{
    Point(int xx, int yy) : x(xx), y(yy) {}
    int x;
    int y;
};

std::vector<Point> p;

p.push_back(Point(5,3));
p.push_back(Point(6,4));
p.push_back(Point(7,5));
#包括
结构点
{
点(intxx,intyy):x(xx),y(yy){
int x;
int-y;
};
std::向量p;
p、 向后推(点(5,3));
p、 向后推(点(6,4));
p、 向后推(点(7,5));

我定义了一个简单的
Point
类,因为如果您正在编写一个关于Point的程序,这似乎也是合理的。但是,如果您真的想将点存储为字符串,然后将
std::vector
替换为
std::vector

首先,获取std::string对象的地址并将其递增-std::string不是
(w)char[]
。它确实连续存储数据,但也以实现定义的方式存储一些元数据。因此,您正在覆盖恰好位于内存中的某些内容,并且您正在使用与其类型不匹配的内容覆盖它,因此它甚至不会编译

在操作std::strings时,可以使用运算符[],该运算符将允许您访问字符串的实际数据


也就是说,我非常确定您不想存储指向字符串的随机指针。理想情况下,用
tx,y制作一个类
数据成员以存储坐标。

首先,获取std::string对象的地址并将其递增-std::string不是
(w)char[]
。它确实连续存储数据,但也以实现定义的方式存储一些元数据。因此,您正在覆盖恰好位于内存中的某些内容,并且您正在使用与其类型不匹配的内容覆盖它,因此它甚至不会编译

在操作std::strings时,可以使用运算符[],该运算符将允许您访问字符串的实际数据


也就是说,我非常确定您不想存储指向字符串的随机指针。理想情况下,用
tx,y制作一个类
数据成员以存储坐标。

好的,我明白你的意思。现在,当我想到这一点,我所做的是相当愚蠢的。非常感谢,真的。好吧,我明白你的意思。现在,当我想到这一点,我所做的是相当愚蠢的。真的非常感谢。那只是为了调试我的代码。其余部分与指针非常吻合。无论如何,谢谢。那只是为了调试我的代码。其余部分与指针非常吻合。无论如何,谢谢。我知道指针是如何工作的,尽管我没有和它们一起工作过那么多。不管怎样,我不认为避免困难的事情是一条路(那样的话,我永远也学不会)。我在代码中通过引用传递了很多其他东西,所以在这种情况下,我需要指针。谢谢你。编辑:事实上,我应该提到这一部分只是为了调试的目的…使用向量比使用p更简单