Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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++ 数组和指针算术混淆 #包括 使用名称空间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

,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) = 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<