指针的使用-非常混乱!C++; 我正在用一些书学习C++,试图边学习边学习SDL。我知道指针“指向”变量的内存地址,它们可以用来“引用”变量。但我不明白他们的目的?如何正确使用它们

指针的使用-非常混乱!C++; 我正在用一些书学习C++,试图边学习边学习SDL。我知道指针“指向”变量的内存地址,它们可以用来“引用”变量。但我不明白他们的目的?如何正确使用它们,c++,c,arrays,pointers,C++,C,Arrays,Pointers,我有几本书中的例子(我在让我困惑的代码下面添加了): 现在我们用“*字母”代替“字母”——这意味着它被取消引用了,对吗?这实际上是做什么的 string[4] = '!'; std::cout << string << '\n'; system("PAUSE"); return 0; } string[4]='!'; 标准::cout 然后我们在指针上使用+=运算符?怎么用?你要加什么?我们将3添加到什么 字母实际上指向字符串的第一个元

我有几本书中的例子(我在让我困惑的代码下面添加了):

现在我们用“*字母”代替“字母”——这意味着它被取消引用了,对吗?这实际上是做什么的

    string[4] = '!';
    std::cout << string << '\n';
    system("PAUSE");

    return 0;
}
string[4]='!';
标准::cout
然后我们在指针上使用+=运算符?怎么用?你要加什么?我们将3添加到什么

字母实际上指向字符串的第一个元素
Hello
。通过向其添加
3
letter
将指向字符串的元素3(第4个元素)

现在我们用“*字母”代替“字母”——这意味着它被取消引用了,对吗?这实际上是做什么的

Defreference表示您正在检索存储在
字母
指向的位置的值

当需要时,引用指针(例如.*pointer=2;)用于更改变量的值(或数组位置)


通过执行
*指针=2
您正在将
2
存储到
指针
指向的位置,即更改变量的值

您需要从头开始理解指针

char string[6] = "Hello"; //string an array of 6 characters including null char
char* letter = string;    //letter pointer pointing to string array,stores first char address
letter += 3;  // Letter pointer in incremented by 3 char. Now it points to 4th char of string
*letter='p';  //replacing 4th char of string by p
cout<<letter; //prints "po";
charstring[6]=“你好”//字符串包括空字符在内的6个字符的数组
字符*字母=字符串//指向字符串数组的字母指针,存储第一个字符地址
字母+=3;//递增3个字符的字母指针。现在它指向字符串的第四个字符
*字母class='p'//用p替换字符串的第4个字符
在这个定义中cout

char* letter = string;
字母设置为字符数组字符串的第一个元素的地址

所以*字母的值为“H”。 让我们考虑例如语句

++letter;
*letter = 'p'
string[4] = '!';
*++letter = '!';
此语句将指针“移动”到字符串的下一个元素。现在指针指向字符串的第二个元素。现在pf*letter的值是“e”,因为letter指向第二个元素

以三次运算符++为例

++letter; ++letter; ++letter;
相当于

letter += 3;
也就是说,指针移动了三次,现在它指向字符串中的第二个“l”

此声明

++letter;
*letter = 'p'
string[4] = '!';
*++letter = '!';
将“l”替换为“p”,您将得到如下字符串

"Helpo"
执行后语句

++letter;
*letter = 'p'
string[4] = '!';
*++letter = '!';
字符串包含

"Help!"
而不是 字符串[4]=“!”

你可以写

++letter;
*letter = '!';
或者您可以将这两个语句组合在一个语句中

++letter;
*letter = 'p'
string[4] = '!';
*++letter = '!';
编辑:“指针”包含对象的地址。写入*指针时,直接访问对象本身,因此*pointer=2更改“pointer”指向的对象

此外,您还应了解,例如,如果您

int a[10];
int *p = a;
假设p(存储在p中的地址)的值是4。表达式++p或p+1表示指针已“移动”到数组的下一个元素。这意味着p的新值不是5。p的新值是p+sizeof(int),即8,前提是sizeof(int)等于4


在你的例子中,根据C++标准,siZeof(char)总是等于1。

<强>用整数值递增指针(用例子说明):>/P> 假设

int*x
指向内存地址1000,并将其递增3:
x+=3

变量
x
现在将指向内存地址
1000+sizeof(int)

int
的大小取决于编译器;假设您的系统上有4个字节

所以变量
x
指向内存地址1012(1000+3*4)

现在,假设您使用
x
读取
x
指向的内存地址处的值:

int y = *x;

在运行期间,CPU将从
x
指向的内存地址读取4个字节,并将它们存储到变量
y
,这样
y
将包含与地址范围1012-1015中存储的值相同的值。

我认为您需要更好的书籍。你看一看,很公平,这是一本1997年的旧书,但我把它放在那里了。我将检查我的C++底漆关于指针的内容,很多指针。非常困惑。哇!的确太混乱了。谢谢你-这让事情变得明朗了一点。字符串[4]=“!”;不过,部分代码确实有效——你是说它不应该有效吗?:)@乔治!;那是打字错误。我纠正了它。当然可以,所以基本上字母指针指向第一个元素。我认为指针默认指向一个可变的内存地址?这就是我不明白的。从这个意义上讲,数组是一种内存地址吗?为什么我们不需要使用“&”?当您声明一个指针时,它可以指向内存中的任何地方(悬空指针)。在程序中使用它之前,需要通过向它传递变量地址来初始化它。如果变量不是指针或数组类型(对于数组,在大多数情况下,数组名称转换为指向其第一个元素的指针),则不需要
&
运算符,否则需要
&
运算符。感谢链接和注释-这也有助于将其清除一点。因此,默认情况下,指针字母设置为字符串数组的位置1(或0,具体取决于您如何看待它)?啊,这让人困惑:D
string
是一个由6个字符组成的数组。是的,我明白了,我的意思是为什么指针首先被设置为指向数组位置——可以说,它不应该指向数组的内存地址吗。或者它们是等价物?啊哈!这个答案非常有用!非常感谢。我唯一不清楚的部分是为什么指针可以说指向数组的第一个位置——我认为指针最初指向变量内存地址。这是备忘录吗