指针的使用-非常混乱!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,具体取决于您如何看待它)?啊,这让人困惑:Dstring
是一个由6个字符组成的数组。是的,我明白了,我的意思是为什么指针首先被设置为指向数组位置——可以说,它不应该指向数组的内存地址吗。或者它们是等价物?啊哈!这个答案非常有用!非常感谢。我唯一不清楚的部分是为什么指针可以说指向数组的第一个位置——我认为指针最初指向变量内存地址。这是备忘录吗