学习指针可能很棘手。像访问数组一样访问它们非常简单且易于理解。创建它们可能很难理解,因为
&
的使用方式有多种。将它们投射到任何东西上似乎真的很容易,如果不小心的话,也是一种破坏各种东西的方法。
我没有学到的两件事是将指针转换为数组和数组赋值。指针基本上可以转换为任何类型,因此推测转换为数组类型应该是一项简单的任务。至于分配给数组,这大概是可能的,因为除非 const,否则其他所有内容都是可分配的。
因此,像下面这样的东西对于将指针转换为数组类型并分配给数组来说会非常优雅。
int x = 1
int arr[2] = { 2, 3 };
int* ptr = new int[10];
// plus some initialization code for ptr
arr = &ptr[1]; // assign address of ptr[1] to arr
这不起作用,所以在浪费任何人的时间之前,我想确保我理解我正在使用的数据。主要是值和地址。因此,我编写了一个简单的程序来输出一些地址和值。输出如下:
Address of {type: int} &x = 0031FEF4; x = 1
Address of {type: int[2]} &arr = 0031FEE4; arr = 0031FEE4
Address of {type: int[2]} &arr[0] = 0031FEE4; arr[0] = 2
Address of {type: int[2]} &arr[1] = 0031FEE8; arr[1] = 3
Address of {type: int*} &ptr = 0031FED8; ptr = 008428C8
Address of {type: int*} &ptr[0] = 008428C8; ptr[0] = 2
Address of {type: int*} &ptr[2] = 008428D0; ptr[2] = 1
在向自己明确表示我“知道”什么值在哪里(例如存储在
arr
的地址)后,我来这里是为了弄清楚为什么 arr = &ptr[1];
不起作用。
arr
不应该是可分配的吗?我可以不以这种方式将指针转换为数组吗?
首先
b
是一个数组,而不是指针,所以它是不可赋值的。
此外,您不能将任何内容转换为数组类型。但是,您可以转换为指向数组的指针。 请注意,在 C 和 C++ 中,指向数组的指针相当不常见。使用普通指针或指针到指针并避免使用指针到数组几乎总是更好。
无论如何,你要求的事情或多或少都可以做到:
int (*c)[2] = (int(*)[2])new int[2];
但是
typedef
会让事情变得更容易:
typedef int ai[2];
ai *c = (ai*)new int[2];
为了安全起见,删除应该使用原始类型来完成:
delete [](int*)c;
如果你只是为了好玩的话,那就太好了。对于现实生活,通常最好使用
std::vector
。
虽然您无法重新分配数组标识符..有时您所做的事情的精神允许您简单地创建一个引用并将自己伪装成一个数组。 注意:这只是罗德里戈答案的轻微扩展......仍然值得一提的是,可能有更好的方法来完成任何任务。
#include <iostream>
int main() {
int x[1000] = {0};
for(int i = 0; i < 10; ++i) {
int (&sub_x)[100] = *(int(*)[100])(&x[i*100]);
//going right to left basically:
// 1. x[i*100] -- we take an element of x
// 2. &x[N] -- we take the address of the element
// 3. (int(*)[100]) -- we cast it to a pointer to int[100]
// 4. *(...) -- lastly we dereference the pointer to get an lvalue
// 5. int (&sub_x)[100] -- we create the reference `sub_x` of type int[100]
for(int j = 0; j < 100; ++j) {
sub_x[j] = (i*100)+j;
}
}
for(int i = 0; i < 1000; ++i) {
if(i != 0) {
std::cout << ", ";
}
std::cout << x[i];
}
std::cout << std::endl;
}
正如您所期望的,输出最终会毫无间隙地打印 0-999
输出:
0, 1, 2, ..., 999