C++ 数组和指针算术混淆 #包括 使用名称空间std; int main() { 整数[5]; int*p; p=数字;*p=10; p++;*p=20; p=&numbers[2];*p=30; p=数字+3;*p=40; p=数字;*(p+4)=50; 对于(int n=0;n
,web上有很多关于指针如何工作的页面。但是有一些东西需要快速指出C++ 数组和指针算术混淆 #包括 使用名称空间std; int main() { 整数[5]; int*p; p=数字;*p=10; p++;*p=20; p=&numbers[2];*p=30; p=数字+3;*p=40; p=数字;*(p+4)=50; 对于(int n=0;n,c++,pointers,pointer-arithmetic,C++,Pointers,Pointer Arithmetic,,web上有很多关于指针如何工作的页面。但是有一些东西需要快速指出 #include <iostream> using namespace std; int main () { int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4
#include <iostream>
using namespace std;
int main ()
{
int numbers[5];
int * p;
p = numbers; *p = 10;
p++; *p = 20;
p = &numbers[2]; *p = 30;
p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n<5; n++)
cout << numbers[n] << ", ";
return 0;
}
上一行的意思是p是指向int的指针。给它赋值不会改变它是什么。它是指向int的指针,而不是int的数组
int* p;
此赋值获取存储数组的地址,并将其分配给p。p现在指向该数组的开头
int number[5];
p = number;
p现在指向数组中的第二个int。指针按其指向的对象的大小递增。因此,实际地址可能会增加4或8,但会转到int的下一个地址
p++;
这是一个赋值,不是一个比较。它并没有说p指向的是30,而是将30复制到p指向的地址中。在编程术语中,说“等于”通常会让人混淆,所以使用“赋值”或“比较”要说清楚。网络上有很多关于指针如何工作的页面。但是有几件事需要快速指出
#include <iostream>
using namespace std;
int main ()
{
int numbers[5];
int * p;
p = numbers; *p = 10;
p++; *p = 20;
p = &numbers[2]; *p = 30;
p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n<5; n++)
cout << numbers[n] << ", ";
return 0;
}
上一行的意思是p是指向int的指针。给它赋值不会改变它是什么。它是指向int的指针,而不是int的数组
int* p;
此赋值获取存储数组的地址,并将其分配给p。p现在指向该数组的开头
int number[5];
p = number;
p现在指向数组中的第二个int。指针按其指向的对象的大小递增。因此,实际地址可能会增加4或8,但会转到int的下一个地址
p++;
这是一个赋值,不是一个比较。它并没有说p指向的是30,而是将30复制到p指向的地址中。在编程术语中,说“等于”通常会让人混淆,所以使用“赋值”或“比较”要清楚。在C++中使用这样的指针:
p=numbers
使p指向数组的第一个元素。因此,当您执行p++
时,您使p
指向第二个元素
现在,执行*p=10
将10
分配给p
指向的任何对象,就像在您的例子中p
指向数组的第一个元素一样,那么*p=10
与数字[0]=10
相同
如果您稍后看到:*(p+i)=20
,这是指针算法,与p[i]=20
相同。这就是为什么p[0]=10
相当于*(p+0)=10
,相当于*p=10
关于你的问题:<代码>当p是地址时,你如何做p= p+1:C++中的数组是顺序存储在内存中的,如果元素<代码> p>代码>指向内存地址<代码> 6400010 < /代码>,则<代码> P++< /C> >点在<代码> 6400014代码> >假设每个元素由<代码> p>代码>占用4字节。为什么<代码> P++<代码>是<代码> 6400014 > /代码>而不是<代码> 6400011 >代码>,原因是一个小魔术C++:当增加指针时,它不会增加<代码> 1字节< /> >而是由<代码> 1元素< /代码>,因此如果指向整数,则每个占用代码> 4字节< /代码>,然后<代码> p>代码>将由<代码> 4 < /代码增加。>在C++中使用这样的指针,而不是
1
:p=numbers
使p指向数组的第一个元素。因此,在执行p++
操作时,使p
指向第二个元素
现在,执行*p=10
将10
分配给p
指向的任何对象,就像在您的例子中p
指向数组的第一个元素一样,那么*p=10
与数字[0]=10
相同
如果您稍后看到:*(p+i)=20
,这是指针算法,与p[i]=20
相同。这就是为什么p[0]=10
相当于*(p+0)=10
,相当于*p=10
关于你的问题:<代码>当p是地址时,你如何做p= p+1:C++中的数组是顺序存储在内存中的,如果元素<代码> p>代码>指向内存地址<代码> 6400010 < /代码>,则<代码> P++< /C> >点在<代码> 6400014代码> >假设每个元素由<代码> p>代码>占用4字节。为什么<代码> P++<代码>是<代码> 6400014 > /代码>而不是<代码> 6400011 >代码>,原因是一个小魔术C++:当增加指针时,它不会增加<代码> 1字节< /> >而是由<代码> 1元素< /代码>,因此如果指向整数,则每个占用代码> 4字节< /代码>,然后<代码> p>代码>将由<代码> 4 < /代码增加。>而不是
1
1>p=numbers;
指针
p
现在指向数组的开头,即第一个元素。2>
*p=10;
第一个元素现在变为10,因为
p
指向第一个元素。
3>
p++;
这会将指针移动到数组的下一个元素,即第二个元素
因此,同样
*p=20;
将使第二个元素=20
4>
p=&numbers[2];
此语句表示
p
现在指向数组的第三个元素。因此,
*p=30;
将使3rd element=30
5>
p=number+3;
我们做的
p=numbers+1;
它指向第二个元素,所以p=numbers+3;
现在将指向数组的第四个元素。*p=40;
使第四个元素=40
6>
p=number;
再次
p
指向数组的第一个元素*(p+4)=50<