数组和单个数据点使用指针之间的区别
Difference between the use of pointers for array and single data point?
#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int var[MAX] = {10, 100, 200};
int *ptr;
// let us have array address in pointer.
ptr = var;
for (int i = 0; i < MAX; i++)
{
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the next location
ptr++;
}
return 0;
}
我不明白为什么这段代码应该按照正确的语法工作
ptr=&var[0];
而不是
ptr=var;
如果 var 会是这样的
int var=49;
然后,我的推理版本成立,早期程序失败。他们对数组和单个数据点的指针有什么独特的概念吗?
我不明白为什么这段代码应该按照正确的语法工作
ptr=&var[0];
而不是
ptr=var;
分配指针的两种方法是等效的。在将数组变量分配给指针的表达式中C++将数组名称解释为指向数组初始元素的指针,即 &var[0]
.
如果 var 会是这样的
int var=49;
然后,我的推理版本成立,早期程序失败。
这是因为C++提供了从数组到指针的隐式转换,而不是从标量变量到指针的隐式转换。
首先,我们应该明白指针和数组在 C 或 C++ 中的处理方式相同,至少在我们超越定义后是这样。让我们确保我们了解一些事情。从您上面描述的示例来看,以下内容是等效的(在 ptr=var 之后)。
var[0], *var, ptr[0], ptr.全部 == 10。
在以下情况下:
ptr = &var[0];
那就是分配 var 的第一个元素的地址。另一种说法是 &var 是指向 int 的指针。我们知道 var 是指向 int (int *) 的指针,而 *var 是 int
。如果 *var 和 var[0] 是等价的,那么我们做的是 *(&var) 的等价物,它只是 var。
也许为了更清楚地说明这一点,你可以考虑一个不同于 0 的索引。 var[1] 与 (var + 1) 相同。它认为:
ptr = var + 1
与
ptr = &var[1]
它们只是表达同一件事的两种不同方式。
在 int var=49 示例中,var 是一个 int,而不是指向 int 的指针(请记住,数组只是一个指针,因此指向 int 的指针与 int 数组相同)。您可以将其表示为:
int var=49;
ptr = &var;
然后,如果您删除循环(或设置 MAX=1),您将获得所需的结果。
将 * 视为删除寻址级别(指针)和 & 添加寻址级别。这有点令人困惑,因为 * 在定义它们时会做相反的事情。
int **i;
表示指向 int 指针的指针。然后:
&i - 指向指向 int 指针的指针的指针。i - 指向整数指针的指针。*i - 指向整数的指针**i - inti[0] - 整数指针*i[0] - 国际
C 和 C++ 中的指针只是另一种数据类型。"他们的数组和单个数据点的指针有什么独特的概念吗?"这个问题有点缺陷,因为在你的例子中,你有一个数组(相当于一个指针),而不是一个指向指针的数组。单个数据点(在第二个示例中为 int var=49)仍然具有地址,但不是数组,因此它不是指针类型,而是整数类型。您可以轻松地将其描述为:
int var[1] = {49};
这是一个指向单个 int 的数组(指针),不应与 int 混淆。
数组名称将其第一个元素的地址保存在内存中。 即指针。
int array[2] = {1,2}; // "array" is a pointer to array[0]
int **p = &array; //pointer to pointer to array[0]
数组的名称是数组第一个索引的reference
。为数组分配pointer
的正确方法是:
int *ptr = arrayName;
或
int *ptr = &arrayName[0];
要记住的另一件事是,您可以将偏移量添加到指针以引用数组的其他元素。这将指向 aray *ptr++;
OR *ptr+=1;
的第一个值。而使用变量指针执行此操作会产生意想不到的结果。
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- AVX 指令中寄存器和指针之间的客观差异
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 类指针之间的 Qt 差异
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 按值和引用传递指针之间的区别?
- 可以在指向不同模板类实例的指针之间进行强制转换吗
- 函数指针和传递指针之间的区别
- 作为 int 传递和类内部指针之间的差异给我带来了分段错误
- 比较C 中移动和智能指针之间的习惯
- 无效指针和非初始化的指针之间的差异
- 拉链比较整数和指针之间
- 指针数组(*a)[]和双指针** a之间的差异
- ->运算符和指针 * 之间的区别 (C++)
- 在 c++ 中,指向 int 的指针和指向指向 int 的指针之间的区别是什么?
- 指针之间的强制转换运算符
- 函数对象和函数指针之间的差异
- 指针之间的运算符重载
- 两个指针之间的差异是合法的 c++17 常量表达式