关于指针作为数组的一些疑问?

时间:2016-04-14 03:14:09

标签: c++ arrays pointers

我是C ++的初学者,我想使用动态内存分配技术而不是静态(如在数组中) 例如,我想制作一维数组 int a [100]; 我该如何用指针做同样的事情? 什么基本上我很困惑的是,我已经查看了互联网上的一些教程,他们做了像

int a[100];
int *arr = &a[0]; 

我发现它没用,因为首先我们声明大小为100的数组a,然后我们再次使用arr指针 我可以这样做吗

int a[1]; 
int *arr= &a[0];

现在,如果我确实为arr [i]分配随机值(从i = 0到i =用户定义) 会超越i = 1

接受它吗?

3 个答案:

答案 0 :(得分:3)

  

它会接受i = 1以外的

不,这是UB,因为您正在尝试访问您根本没有分配的内存。

你可能想要

int* a = new int[user_define_value];
// use it from a[0] ~ a[user_define_value - 1]
delete[] a;

顺便说一句:如果你想使用动态大小的数组,那么了解std::vector是个好主意,而对于c ++中的静态大小数组则是std::array

答案 1 :(得分:1)

这是你在这里谈论的C代码,这些因为正确分配和调整大小而臭名昭着:

int *arr = malloc(sizeof(int) * 100);

那可能会回来NULL这意味着你什么都没有,所以你必须测试它是否成功了。 C ++有new运算符,如果失败则至少抛出异常,这样就更难忽略:

int *arr = new int[100];

如果您希望有效地使用C ++,那么您应该使用像std::vector这样的C ++标准库容器:

std::vector<int> arr(100);

答案 2 :(得分:1)

重新启动代码段

int a[1]; 
int *arr= &a[0];

...你问

  

如果我确实为arr [i]指定了随机值(从i = 0到i =用户定义),它会接受i = 1以外的

答案是,代码将被接受(可能带有警告),但它将具有未定义行为 UB ,因为您将会这样做存储超出分配数组末尾的值,该数组的大小仅为1。

没有自动扩展原始数组。

C ++中基本的动态大小数组是std::vector。 E.g。

#include <vector>
using namespace std;

auto main() -> int
{
    vector<int> a( 100 );
    // Your code using it, here.
}

...动态分配缓冲区。它最后也会自动解除分配。它可以自动动态扩展,例如当您使用push_back方法时。

使用原始指针,您可以改为

auto main() -> int
{
    int* a = new int[100];
    // Your code using it, here.
    delete[] a;
}

...但这是更脆弱的代码,它缺少std::vector的大部分功能,例如检查大小,附加,赋值和一般复制(特别是对于函数结果)。

即使声明的基本功能也不完全等效,因为std::vector数组项默认为零初始化,而new - 表达式产生未初始化的数组,具有不确定值的数组。但是,您可以通过添加空括号来指定您想要零初始化。然后它看起来像这样:

int* a = new int[100]();

这只是使用原始指针和原始数组时必须处理的无数细微之处。

作为初学者,你应该尽量避免使用原始指针和原始数组。

你无法完全避免它们(例如,main采用原始数组参数,任何字符串文字都是原始数组,而C风格API处理原始数组),但是你越是避免它们,问题越少,你的工作效率越高。