Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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++中的自己的数组_C++_Arrays_Pointers - Fatal编程技术网

使用指针创建C++中的自己的数组

使用指针创建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;

我正在尝试编写自己的简单数组,希望更好地理解数组的内部工作方式

从概念上讲,我认为数组只是指向其基本元素的指针,将该指针增加1将指向下一个后续元素

我把这个代码写成了我的简单数组:

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我们说的数组意味着连续字节存储,对吗?还是不?您所指的数组对象现在似乎是更高级或更现代的概念。