当我在指针地址中加起来时它指向我的数组?为什么?引用和取消引用混淆 C++
When I add up in my pointer address it points to my array? Why? Reference and Dereference confusion C++
在这个例子中,
我有一个包含四个元素的数组。我已经声明了一个指向包含数组地址的整数的指针。然后我以 3 种不同的方式显示了第 0 个索引的地址。同样,第一个索引的地址以 3 种不同的方式显示。当我输出这个 (&pNumbers)+0 时,它会显示一个唯一且不同的地址,这是可以理解的。在下一行中,*(&pNumbers+0) 显示第 0 个索引地址(因为它包含在指针中)。现在问题部分来了。在输出此 (&pNumbers)+1 行时,它再次显示数组第 0 个索引。为什么?
第一个问题:
当我检索指针地址 (&pNumbers) 时,它会显示新的唯一地址。但是当我在那个地址加起来的时候。它是如何访问数组的元素地址的?
例如
enter code here
cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl // new address + 1 but showing address of 0 element.
cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl // showing address of of 1st index
第二个问题:
如果说它确实以某种方式指向相应的数组元素。在取消引用时,为什么它没有显示与数组元素对应的正确数据值。
例如
enter code here
cout<<" *(&pNumbers+1) "<< *(&pNumbers+1) // assumption was 31 (but displaying some 0x1f)
cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl // assumption was 28 (but displpaying 0x1c)
下面是源代码:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main()
{int number[] = { 31, 28, 31, 30};
int *pNumbers = number;
cout<<" Address of number[0] "<<number<<endl;
cout<<" Address of number[1] "<<number+1<<endl;
cout<<" Address of number[2] "<<number+2<<endl;
cout<<" Address of number[3] "<<number+3<<endl<<endl;
cout<<" Address of &pNumbers "<< &pNumbers<<endl<<endl; // address of pNumbers
cout<<" Address of number "<< number<<endl; // address of array's first element
cout<<" pNumber Address "<< pNumbers<<endl;
cout<<" &(pNumbers[0]) "<< &(pNumbers[0])<<endl<<endl;
cout << " pNumbers+1: " << pNumbers+1<<endl; //address of array's second element
cout<<" (&pNumbers[1]) "<<(&pNumbers[1])<<endl; //
cout<<" (pNumbers+1) "<< (pNumbers+1) <<endl<<endl;
cout<<" (&pNumbers)+0 "<< (&pNumbers)+0<<endl;
cout<<" *(&pNumbers+0) "<< *(&pNumbers+0)<<endl<<endl;
cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl<<endl; // new address + 1 expected but displaying array's 0th index address why ?
cout<<" *(&pNumbers+1) "<<*(&pNumbers+1)<<endl<<endl;
cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl<<endl;
cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl<<endl;
cout<<" (&pNumbers + 3) "<<(&pNumbers+3)<<endl<<endl;
cout<<" *(&pNumbers + 3) "<<*(&pNumbers+3)<<endl<<endl;
cout<<" (&pNumbers + 4) "<<(&pNumbers+4)<<endl<<endl;
cout<<" *(&pNumbers + 4) "<<*(&pNumbers+4)<<endl<<endl;
return 0;
}
这是大多数平台上堆栈的内存布局。
On outputting this (&pNumbers)+1 line it displays the array 0th index again. Why ?
您的代码获取 pNumbers
内存单元的地址(&pNumbers
的类型为 int **
),然后向其添加一个,其语义是按指针的大小递增它,因此表达式 &pNumbers + 1
是原始数组的地址,因为 pNumbers
变量本身就是一个指针。
关于你的第二个问题,表达式 *(&pNumbers+1)
所做的基本上是试图将存储 int
的内存位置解释为指向 int 的指针(int *
中 *(&pNumbers+1)
的类型).这就是为什么您看到 int 为十六进制而不是 dec 格式的原因。换句话说,您将 number[0]
视为 int *
并打印它。
所有这些东西中可能令人困惑的是,数组被视为指向其第一个元素的指针,这导致 number
和 &number
本质上是相同的地址(但两个表达式具有不同的类型)
希望能有所帮助。
在这个例子中, 我有一个包含四个元素的数组。我已经声明了一个指向包含数组地址的整数的指针。然后我以 3 种不同的方式显示了第 0 个索引的地址。同样,第一个索引的地址以 3 种不同的方式显示。当我输出这个 (&pNumbers)+0 时,它会显示一个唯一且不同的地址,这是可以理解的。在下一行中,*(&pNumbers+0) 显示第 0 个索引地址(因为它包含在指针中)。现在问题部分来了。在输出此 (&pNumbers)+1 行时,它再次显示数组第 0 个索引。为什么?
第一个问题: 当我检索指针地址 (&pNumbers) 时,它会显示新的唯一地址。但是当我在那个地址加起来的时候。它是如何访问数组的元素地址的? 例如
enter code here
cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl // new address + 1 but showing address of 0 element.
cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl // showing address of of 1st index
第二个问题: 如果说它确实以某种方式指向相应的数组元素。在取消引用时,为什么它没有显示与数组元素对应的正确数据值。 例如
enter code here
cout<<" *(&pNumbers+1) "<< *(&pNumbers+1) // assumption was 31 (but displaying some 0x1f)
cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl // assumption was 28 (but displpaying 0x1c)
下面是源代码:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main()
{int number[] = { 31, 28, 31, 30};
int *pNumbers = number;
cout<<" Address of number[0] "<<number<<endl;
cout<<" Address of number[1] "<<number+1<<endl;
cout<<" Address of number[2] "<<number+2<<endl;
cout<<" Address of number[3] "<<number+3<<endl<<endl;
cout<<" Address of &pNumbers "<< &pNumbers<<endl<<endl; // address of pNumbers
cout<<" Address of number "<< number<<endl; // address of array's first element
cout<<" pNumber Address "<< pNumbers<<endl;
cout<<" &(pNumbers[0]) "<< &(pNumbers[0])<<endl<<endl;
cout << " pNumbers+1: " << pNumbers+1<<endl; //address of array's second element
cout<<" (&pNumbers[1]) "<<(&pNumbers[1])<<endl; //
cout<<" (pNumbers+1) "<< (pNumbers+1) <<endl<<endl;
cout<<" (&pNumbers)+0 "<< (&pNumbers)+0<<endl;
cout<<" *(&pNumbers+0) "<< *(&pNumbers+0)<<endl<<endl;
cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl<<endl; // new address + 1 expected but displaying array's 0th index address why ?
cout<<" *(&pNumbers+1) "<<*(&pNumbers+1)<<endl<<endl;
cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl<<endl;
cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl<<endl;
cout<<" (&pNumbers + 3) "<<(&pNumbers+3)<<endl<<endl;
cout<<" *(&pNumbers + 3) "<<*(&pNumbers+3)<<endl<<endl;
cout<<" (&pNumbers + 4) "<<(&pNumbers+4)<<endl<<endl;
cout<<" *(&pNumbers + 4) "<<*(&pNumbers+4)<<endl<<endl;
return 0;
}
这是大多数平台上堆栈的内存布局。
On outputting this (&pNumbers)+1 line it displays the array 0th index again. Why ?
您的代码获取 pNumbers
内存单元的地址(&pNumbers
的类型为 int **
),然后向其添加一个,其语义是按指针的大小递增它,因此表达式 &pNumbers + 1
是原始数组的地址,因为 pNumbers
变量本身就是一个指针。
关于你的第二个问题,表达式 *(&pNumbers+1)
所做的基本上是试图将存储 int
的内存位置解释为指向 int 的指针(int *
中 *(&pNumbers+1)
的类型).这就是为什么您看到 int 为十六进制而不是 dec 格式的原因。换句话说,您将 number[0]
视为 int *
并打印它。
所有这些东西中可能令人困惑的是,数组被视为指向其第一个元素的指针,这导致 number
和 &number
本质上是相同的地址(但两个表达式具有不同的类型)
希望能有所帮助。