1

我需要你对 C/С++ 数组的帮助。我已经用 Python 编程三年了,它的数组(称为list)很容易使用。

>>> array = [1,2,3,4]
>>> array.append(5)
>>> array
[1,2,3,4,5]

正如我在 C/C++ 中所读到的,我需要创建一个指向数组的指针。请您制作一个类的小草图,其中包含数组char并且只有一个方法 append,它被调用append并接收 achar作为参数。此方法将数组的大小增加 1 并将给定的值添加char到该数组中。

有人可能会认为这是一个功课,但我就是无法理解数组、指针和内存分配的工作原理。我想这并不难,但在 Python 之类的语言之后就很难了,因为我不关心 Python 中的这些东西。请您提供一小段带有解释的代码吗?

提前致谢!

4

5 回答 5

5

这是一个标准的 C++ 程序:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> array = {1, 2, 3, 4};
    array.push_back( 5 );

    for( auto const item : array )
    {
        cout << item << " ";
    }
    cout << endl;
}

Visual C++ 特定。

即使是 Microsoft 的 Visual C++ 的最新版本,即2012 年 11 月的 CTP,它是 11.0 版,其中包含许多支持 C++11 标准的修复程序,还不支持上面使用的一般初始化。

在 Visual C++ 中,就像在 C++03 中一样,这种表示法仅支持所谓的聚合类型,它们本质上是纯原始数组或纯原始结构(可能包含更多 C++'ish 类型)或内置类型。因此,使用 Visual C++ 的一种方法是使用该符号表示原始数组,然后使用该原始数组初始化vector

#include <iostream>
#include <iterator>     // std::begin, std:.end
#include <vector>
using namespace std;

int main()
{
    int const   data[]  = {1, 2, 3, 4};
    vector<int> array( begin( data ), end( data ) );
    array.push_back( 5 );

    for( auto const item : array )
    {
        cout << item << " ";
    }
    cout << endl;
}

这也与 Visual Studio 2012 附带的基本 Visual C++ 11.0 一起编译得很好。

但是,基于范围的for循环可能无法使用 Visual C++ 10.0(对应于 Visual Studio 2010)进行编译。

于 2012-11-24T15:18:11.890 回答
2

C 和 C++ 是不同的语言。

在现代 C++ 中,您通常不使用原始数组,但例如std::vector为您提供push_back成员函数。

于 2012-11-24T15:14:56.997 回答
1

在 C++ 中,通常从不使用原始(C 风格)数组,而是使用容器,如std::vector(动态大小)或std::array(固定大小,在 C++11 中)。通过这些实现,您的array类是直截了当的(尽管您没有指定访问元素的方法,所以非常不可用)。

class array {
    std::vector<char> v_;
  public:
    void append(char c) {
      v_.push_back(c);
    }
};
于 2012-11-24T15:16:07.397 回答
0

C 和 C++ 中的术语数组都用于表示包含一个或多个相同类型的数据元素的连续内存块。

数组有两种类型:静态数组和动态数组。静态数组是在编译程序时在内存中分配的,并存储在程序的数据段中。顾名思义,动态数组是在运行时从堆(用于访问程序可用于动态分配的内存的数据结构)分配的。

使用指针和索引器([] 运算符)以相同的方式访问这两种数组类型。

在 C 和 C++ 中,指针都是指向内存中某个位置的变量。它指向的内存可能包含一个类或原始数据类型。

然而,静态数组和动态数组之间存在差异。以下是重要的:

  1. 必须分配动态数组以使用它们并释放它们以防止内存泄漏
  2. 静态数组无法调整大小

在 C 中,您使用 分配内存malloc并使用free. 您可以使用调整它的大小realloc

在 C++ 中,您使用 分配内存new并使用delete. 您必须编写自己的代码来调整它的大小。

对于大多数用途,C++ 中的动态数组将使用std::vector. 在 C 中,如果你想要这样的机制,你将不得不自己动手。你从@Cheers 和hth 那里得到了很好的回答。- 阿尔夫std::vector

我不认为这是用 C 或 C++ 编写有关动态内存的完整教程的地方。你可以从http://www.cplusplus.com/doc/tutorial/dynamic/得到很好的介绍

然而,这里有一个示例代码,它将向您展示如何在 C 中做您想做的事情。对于 C++ 使用std::vector

/*
C CODE
*/

#include <stdlib.h>
#include <limits.h>

typedef struct DARRAY dynamic_int_array_t;

typedef struct DARRAY
{
    int length;
    int *data;
    void (*alloc)(dynamic_int_array_t * the_array, int length);/*allocate*/
    void (*free)(dynamic_int_array_t * the_array);/*free*/
    void (*resize)(dynamic_int_array_t * the_array, int new_length);/*resize*/
    void (*append)(dynamic_int_array_t * the_array, int new_value);
    int (*get_at)(dynamic_int_array_t * the_array, int pos);/*use 1 based index getter*/
    void (*set_at)(dynamic_int_array_t * the_array, int pos, int value);/*use 1 based index setter*/
}dynamic_int_array_t;

void allocIntArray(dynamic_int_array_t * the_array, int length)
{
    /*
    Allocate memory to contain length number of integers
    */
    the_array->data = (int*)malloc(length*sizeof(int));
    the_array->length = length;
}

void freeIntArray(dynamic_int_array_t * the_array)
{
    if(NULL != the_array->data)
        free(the_array->data);/*Free the memory*/
    the_array->length = 0;/*Reset the length of the array*/
}

void resizeIntArray(dynamic_int_array_t * the_array, int new_length)
{
    if(NULL != the_array->data && the_array->length > 0 && new_length >= 0)
    {

        if(new_length == 0)/*Free the array if a value of 0 was requested*/
            the_array->free(the_array);
        else
        {
            /*Resize the memory block*/
            the_array->data = (int*)realloc(the_array->data, new_length*sizeof(int));
        }
        the_array->length = new_length;
    }
}

void appendIntArray(dynamic_int_array_t * the_array, int new_value)
{   
    the_array->resize(the_array, the_array->length + 1);
    the_array->data[the_array->length - 1] = new_value;
}

int getAt(dynamic_int_array_t * the_array, int pos)
{
    if(NULL != the_array->data && pos > 0 && pos <= the_array->length)
        return the_array->data[pos-1];
    return INT_MIN;/*use INT_MIN to indicate error*/
}

void setAt(dynamic_int_array_t * the_array, int pos, int value)
{
    if(NULL != the_array->data && pos > 0 && pos <= the_array->length)
        the_array->data[pos-1] = value;
}

int main(int argc, char **argv)
{
    dynamic_int_array_t int_array = 
    {
        0,
        NULL,
        allocIntArray,
        freeIntArray,
        resizeIntArray,
        appendIntArray,
        getAt,
        setAt       
    };

    int_array.alloc(&int_array, 4);
    int_array.data[0] = 1, int_array.data[1] = 2,
        int_array.data[2] = 3, int_array.data[3] = 4;
    printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,4));
    int_array.resize(&int_array, 5);
    int_array.data[4] = 5;/* can also use int_array.set_at(&int_array,5) = 5; */
    printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,5));
    int_array.append(&int_array, 6);
    printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,5));
}
于 2012-11-24T17:08:30.680 回答
0

数组不能改变大小。但是,您可以在 C++ 中使用列表

http://www.cplusplus.com/reference/list/list/

于 2012-11-24T15:15:51.610 回答