使用指针创建C++中的自己的数组
我正在尝试编写自己的简单数组,希望更好地理解数组的内部工作方式 从概念上讲,我认为数组只是指向其基本元素的指针,将该指针增加1将指向下一个后续元素使用指针创建C++中的自己的数组,c++,arrays,pointers,C++,Arrays,Pointers,我正在尝试编写自己的简单数组,希望更好地理解数组的内部工作方式 从概念上讲,我认为数组只是指向其基本元素的指针,将该指针增加1将指向下一个后续元素 我把这个代码写成了我的简单数组: int x = 2; int *ptr = &x; int y = 3; &y = ptr + 1; 这里我们创建一个变量x,并使用ptr指向它。然后,我们创建一个变量y,并尝试将其内存地址更改为ptr ptr+1之后的下一个内存块。这是为了创建阵列的模拟 (&x)[2] = 100;
我把这个代码写成了我的简单数组:
int x = 2;
int *ptr = &x;
int y = 3;
&y = ptr + 1;
这里我们创建一个变量x,并使用ptr指向它。然后,我们创建一个变量y,并尝试将其内存地址更改为ptr ptr+1之后的下一个内存块。这是为了创建阵列的模拟
(&x)[2] = 100; //setting 100 to y indirectly.
现在,这不起作用,因为我后来了解到,一旦创建了一个变量,它的内存是固定的,无论发生什么,也没有办法修改它。那么,我还可以利用哪些其他方法来创建自己的阵列呢?我希望这有助于:
int x = 2;
int *ptr = &x; //ptr points to address of x. yes correct.
int y = 3;
&y = ptr + 1; //the address of next integer after x(internally,
// which is ptr) will be set to address of y(this
// won't work.)
在最后一行中,如果您的意图是使y成为x的内部紧挨着的存储器,则不会发生这种情况,因为int y声明y将是数据持有者,并且不会移动其地址。它的地址永远是固定的
此外,这是基于代码的内部内存
[ 1 byte ] //4 bytes for integer x
[ 1 byte ]
[ 1 byte ]
[ 1 byte ]
[ 1 byte ] //4 bytes for address holder ptr (in 32bit system)
[ 1 byte ]
[ 1 byte ]
[ 1 byte ]
[ 1 byte ] //4 bytes for integer y
[ 1 byte ]
[ 1 byte ]
[ 1 byte ]
通过将y作为数组处理,可以通过x更改y
(&x)[2] = 100; //setting 100 to y indirectly.
注意:由于内部优化,这可能无法在不同的编译器上工作,因此如果在实际项目中使用它,这是一种危险的代码类型。但你可以100%地使用它来娱乐和探索。一种更喜欢编程的方法
另一个更疯狂的例子
(&x)[1] = 0x123498; //setting any address value to ptr.
(&x)[1] = &y; //setting address of y to ptr.
对于你最初的问题,我希望我能理解
那么,我还可以利用哪些其他方法来创建自己的阵列呢
要创建自己的数组,或者说在运行时动态创建,首先必须分配一个字节序列,该序列将适合所需大小的数组。然后通过指针或引用访问元素或任何类型的操作
//---allocate using malloc and free.
int *pIntBuffer = (int*)malloc( 500 * sizeof(int)); //request chunk of memory.
pIntBuffer[10] = 123; //use the array any way you want.
free(pIntBuffer); //be sure to destroy your requested chunk of memory if you don't need it anymore.
//---allocate using new/delete.
int *pAnotherBuff = new int[1000];
pAnotherBuff[900] = *pIntBuffer[10];
delete [] pAnotherBuff;
从概念上讲,我认为数组只是指向其基本元素的指针,这是不正确的。数组是数组,指针是指针。它们是两种不同的类型。帮你自己一个忙,不要把数组当作指针。数组名称可以衰减为指针,但仅此而已,数组仍然是一个数组,并且知道额外的内容,例如数组中有多少个对象。尝试将其内存地址更改为ptr ptr+1之后的下一个内存块-即使您可以这样做,您也在访问未保留的内存。在程序没有为自己分配或保留的内存上执行步进是未定义的行为。您可以使用std::vector,或者至少读取std::vector实现。请参阅。初学者的一个常见误解是数组只是一个指针。这不对。@初学者不,真的不对。如果数组实际上只是指向第一个元素的指针,那么sizeofint[4]将给出4或8,而不是16。您确实不需要将数组视为指针,因为它不是指针。另请参见注意int*malloc 500*sizeofint;实际上不创建数组,在C++20之前是未定义的行为。不确定编译器是否真的会做正确的事情,但它不一定要做。@NathanOliver我们说的数组意味着连续字节存储,对吗?还是不?您所指的数组对象现在似乎是更高级或更现代的概念。