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"; |
帮助您的注意事项
理解指针的障碍是什么?如何克服这些障碍?
用整数值递增指针(用示例说明):
假设您让
变量
所以变量
现在,假设您使用
1 | int y = *x; |
在运行期间,CPU将从
Then somehow we use the += operator on the pointer? How? What's going add? What are we adding the 3 to?
And now here we use '*letter' instead of 'letter' - this means it's dereferenced, right? What does this actually DO?
defreference意味着您正在检索存储在
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?
通过执行