我正在使用一些书来学习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;' (&符号)在指针的上下文中,以及它们如何/为何被使用。
答案 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。