关于指针的使用:指针的使用 – 非常困惑!

Use of Pointers - Very Confused! C++

我正在学习C++,使用了一些书,试图学习SDL。我理解指针"指向"变量的内存地址,并且它们可以用来"引用"变量。但我不明白他们的目的?如何正确使用它们?

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

1
2
3
4
5
6
7
#include <iostream>

int main(void)
{
    char string[6] ="Hello";
    char* letter = string;
    letter += 3;

好的,有一个char指针叫做"letter",它指向字符串的内存地址。然后不知何故,我们在指针上使用了+=运算符?怎样?还有什么?我们将3添加到什么中?

1
    *letter = 'p';

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

1
2
3
4
5
6
7
    string[4] = '!';
    std::cout << string << '
'
;
    system("PAUSE");

    return 0;
}

其余的代码我理解。

谢谢你的回答!

乔治

编辑:那么让我直截了当-当您想更改变量(或数组位置)的值时,可以使用取消引用指针(例如*pointer=2;)。

编辑2:由于每个人的回答,我几乎完全理解我作为示例使用的代码-但是,我仍然不确定在指针的上下文中使用"&;"(和)以及如何/为什么使用它们。


在这个定义中

1
char* letter = string;

字母设置为字符数组字符串的第一个元素的地址。

所以*字母的值为'h'。例如,让我们考虑语句

1
++letter;

此语句"移动"指针以指向字符串的下一个元素。现在指针指向字符串的第二个元素。现在pf*letter的值是"e",因为letter指向第二个元素。

例如,应用三次operator++

1
++letter; ++letter; ++letter;

等于

1
letter += 3;

指针被移动了三次,现在指向字符串中的第二个"l"。

本声明

1
*letter = 'p'

将"l"替换为"p",现在您将得到该字符串

1
"Helpo"

执行语句后

1
string[4] = '!';

字符串包含

1
"Help!"

而不是字符串[ 4 ] ="!";

你可以写

1
2
++letter;
*letter = '!';

或者您可以将这两个语句合并为一个语句

1
*++letter = '!';

edit:'pointer'包含对象的地址。当您写*指针时,您直接访问对象本身,因此*指针=2更改"指针"指向的对象。

你也应该明白,如果你

1
2
int a[10];
int *p = a;

假设p(存储在p中的地址)的值是4。然后表达式+P或P+1意味着指针被"移动"到数组的下一个元素。这意味着p的新值不是5。如果sizeof(int)等于4,则p的新值是p+sizeof(int),即8。

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


你需要从一开始就理解指针开始。

1
2
3
4
5
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";

帮助您的注意事项

理解指针的障碍是什么?如何克服这些障碍?


用整数值递增指针(用示例说明):

假设您让int* x指向内存地址1000,并将其增加3:x += 3

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

int的大小取决于您的编译器;让我们假设它在您的系统上是4个字节。

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

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

1
int y = *x;

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


Then somehow we use the += operator on the pointer? How? What's going add? What are we adding the 3 to?

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

And now here we use '*letter' instead of 'letter' - this means it's dereferenced, right? What does this actually DO?

defreference意味着您正在检索存储在letter点位置的值。

ereferencing a pointer (e.g. *pointer = 2;) is used to change the value of the variable (or array position, for that matter) when you want to?

通过执行*pointer = 2;操作,您将2存储到位置pointer指向,即更改变量的值。