使用指针 - 非常困惑! C ++

时间:2014-02-08 14:06:16

标签: c++ c arrays pointers

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

我有一些书中的例子(我在代码中添加了令我困惑的事情):

#include <iostream>

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

好的,所以有一个名为'letter'的char指针指向string的内存地址。那么我们在指针上使用+ =运算符?怎么样?什么会增加?我们将3 添加到?

是什么?
    *letter = 'p';

现在我们使用'* letter'而不是'letter' - 这意味着它被解除引用了,对吧?这实际上做了什么?

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

    return 0;
}

我理解的其余代码。

感谢您的回答!

乔治

编辑:所以让我直截了当 - 取消引用指针(例如*指针= 2;)用于更改变量的值(或者数组位置,就此而言)想要?

编辑2:感谢大家的回答我几乎完全理解我用作例子的代码 - 但是,我仍然不确定使用'&amp;' (&符号)在指针的上下文中,以及它们如何/为何被使用。

4 个答案:

答案 0 :(得分:1)

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

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";

帮助您的注意事项

What are the barriers to understanding pointers and what can be done to overcome them?

答案 1 :(得分:1)

在此定义中

char* letter = string;

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

所以*字母的值为'H'。 让我们考虑一下例如语句

++letter;

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

应用三次operator ++,例如

++letter; ++letter; ++letter;

相当于

letter += 3;

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

本声明

*letter = 'p'

将'p'替换为'l',您将获得该字符串现在看起来像

"Helpo"

执行声明后

string[4] = '!';

string contains

"Help!"
而不是     string [4] ='!';

你可以写

++letter;
*letter = '!';

或者你可以将这两个陈述合并为一个陈述

*++letter = '!';

编辑:'指针'包含对象的地址。当您编写*指针时,您可以直接访问对象本身,因此* pointer = 2会更改“指针”指向的对象。

另外你应该明白,例如你有

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

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

在您的示例中,根据C ++标准,sizeof(char)始终等于1.

答案 2 :(得分:0)

  

然后我们在指针上使用+ =运算符?怎么样?什么会增加?我们将3添加到什么?

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

  

现在我们使用'* letter'而不是'letter' - 这意味着它被解除引用了,对吧?这实际上做了什么?

取消引用意味着您要检索存储在letter个位置的值。

  

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

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

答案 3 :(得分:0)

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

假设您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包含与{{1}}相同的值。一个存储在地址范围1012-1015。