精华内容
下载资源
问答
  • C++动态数组

    2014-04-24 12:11:21
    详细的C++动态数组的使用讲解,指针数组、动态数组等多种方法
  • c++动态数组

    万次阅读 多人点赞 2018-10-18 13:51:30
    注意:静态数组是在堆栈上(不需要自行释放空间)创建,动态数组是在堆上创建(需要自行释放空间) 涉及内容: 堆(heap)-自由存储区(free store) C语言:malloc和free c++语言:new和delete 1.动态数组定义...

    注意:静态数组是在堆栈上(不需要自行释放空间)创建,动态数组是在堆上创建(需要自行释放空间)

    涉及内容:

    堆(heap)-自由存储区(free store)

    C语言:malloc和free

    c++语言:new和delete

    1.动态数组定义(见后面)

    2.初始化动态数组分配

    string *p_string = new string[10]; //默认的构造函数初始化

    Dog *p_dog = new Dog[10];//调用默认构造函数的初始化

    //动态创建的内置类型数组初始化就要加上一个小括号

    int *pp2 = new int[10]();//使用内置类型的默认值进行初始化

    3.const对象的动态数组

    const指针,这个指针创建了后就不得修改,所以必须首先对其进行初始化操作

    const int *p_const = new const int[100]();

    4.允许动态分配空数组

    5.动态空间的释放

    动态空间的new和delete是成对出现,因此,有了new后就必须进行释放。

    6.动态数组的使用

    动态数组定义:

    为什么需要动态定义数组?

    很多情况下,在预编译过程阶段,数组的长度是不能预先知道的,必须在程序运行时动态的给出,但是问题是,c++要求定义数组时,必须明确给定数组的大小,要不然编译通不过

      如: int Array[5]; 正确

           int i=5;

           int Array[i]; 错误 因为在编译阶段,编译器并不知道 i 的值是多少

       那么,我们该如何解决定义长度未知的数组呢?

       答案是:new 动态定义数组 

       因为new 就是用来动态开辟空间的,所以当然可以用来开辟一个数组空间

       这样,下面的语句:

        int size=50;

        int *p=new int[size]; 是正确的

     

    但是二维动态数组能不能也这样定义呢

      int size=50,Column=50;

      int (*p)[Column]=new int [size][Column]

      这样的语句,编译器通不过,为什么呢?

      首先 new int[size][Column] 就是动态生成时确定的,所以它没有错

      那么就是 int(*p)[Column],这句有问题了,这句为什么不对呢, 那是因为,这是一个定义语句,而定义语句先经过编译器进行编译,当编译器运行到此处时,发现Column 不是常数,因此不能通过编译。 而之所以编译器认为Column 不是常数,是因为编译阶段,编译器起的作用是查语法错误,和预分配空间,它并不执行程序,因此,没有执行那个赋值语句(只是对这个语句检查错误,和分配空间),因此编译阶段,它将认为column 是个变量。所以上面的二维数组定义是错误的, 它不能通过编译。

     

      改成这样:

      int size=50

      int (*p)[50]=new int [size][50]

      便正确了。

    new关键字的过程:

    它实际上做了三件事:

    1、获得一块内存空间

    2、调用构造函数

    3、返回正确的指针。

    string *p_string = new string[10]; //默认的构造函数初始化

    Dog *p_dog = new Dog[10];//调用默认构造函数的初始化

    //动态创建的内置类型数组初始化就要加上一个小括号

    int *pp2 = new int[10]();//使用内置类型的默认值进行初始化

    实例:

    #include<iostream>

    using namespace std;

    int main()

    {

    int a[10];//静态数组,在堆栈上创建

    int n;

     

    cout << "你想要多大的数组:" << endl;

    cin >> n;

    //C语言的malloc函数进行书写

    int *p = (int *)malloc(n * sizeof(int));

    if(p != NULL)

    {

    cout << "c语言 malloc创建动态数组成功!" << endl;

     

    }

    //c++创建动态数组

    int *pp = new int[n];//创建新的数组

    if(pp != NULL)

    {

    cout << "c++创建动态数组成功" << endl;

    }

     

    free(p);//c语言创建的数组释放

    delete[] pp;//c++创建的数组进行释放

     

    cout << "hdd";

    }

     

     

    #include<iostream>

    #include<string>

    using namespace std;

    class Dog

    {

     

    };

    int main()

    {

    int a[10];//静态数组,在堆栈上创建

    int n;

    int *pp_int = new int[10];//创建新的数组,没有初始化,一般内置的类型比如int,double都不会初始化

    string *p_string = new string[10]; //默认的构造函数初始化

    Dog *p_dog = new Dog[10];//调用默认构造函数的初始化

    //动态创建的内置类型数组初始化就要加上一个小括号

    int *pp2 = new int[10]();//使用内置类型的默认值进行初始化

    cout << *(pp2+2) << endl;

     

    //参数赋值

    *pp_int = 9;

    *(pp_int +1) = 10;

    *(pp2+1) = 15;

    *(pp2+4) = 12;

     

    for(int i = 0;i < 10;i++)

    {

    cout << *(pp2 + i) << endl;

    }

     

    //动态数组的初始化

    for(int *ppp = pp_int;ppp != pp_int + 10;ppp++)//针对地址++进行值得后移

    {

    *ppp = 11;

    }

    //遍历(指针遍历)

    for(int *pppp = pp_int;pppp != pp_int + 10;pppp++)

    {

    cout << *pppp << endl;

    }

    //普通循环

    for(int i = 0;i < 10;i++)

    {

    cout << *(pp_int + i) << endl;

    }

     

    //const指针,这个指针创建了后就不得修改,所以必须首先对其进行初始化操作

    const int *p_const = new const int[100]();

    //防止内存泄漏

    delete[] p_const;

    delete[] pp_int;

    delete[] p_string;

    delete[] p_dog;

     

    //双引号代表申请了一个空间,存储字符串,const char *pc意思就是开辟一个指针变量

    //相当于pc = &字符串;即获取字符串的地址。

    //c语言的方式

    const char *pc = "a very long literal string";

    cout << pc << endl;

    const size_t len = strlen(pc);

     

    for(size_t ix = 0;ix != 100; ++ix)

    {

    char *pc2 = new char[len+1];

    strcpy(pc2,pc);

    cout << pc2 << endl;

    delete[] pc2;

    }

     

    //c++语言的方式

    string str("a very long literal string");

    //for(int i = 0;i != 100;i++)

    //{

    string str2 = str;

    cout << "c++" << str2 << endl;

    /*}*/

     

     

     

    }

    展开全文
  • C++ 动态数组

    2017-09-22 20:27:42
    1,C与C++动态数组创建的区别 #include using namespace std; int main() { int n; cout 输入你想创建的数组个数" ; cin >> n; int *p = (int *)malloc(n * sizeof(int)); if(p != NULL) { cout 创建成功" ...

    C++ 动态数组

    1,C与C++动态数组创建的区别

    #include<iostream>
    using namespace std;
    int main()
    {
    	int n;
    	cout <<"输入你想创建的数组个数" << endl;
    	cin >> n;
    	int *p = (int *)malloc(n * sizeof(int));
    	if(p != NULL)
    	{
    		cout << "创建成功" << endl; 
    	}
    	int *b = new int[n];
    	if(b != NULL)
    	{
    		cout << "创建成功" << endl; 
    	} 
    	return 0;
    }

    从上面代码可以看出C语言在创建动态数组的时候比较麻烦。

    2,动态数组初始化

    #include<iostream>
    #include<string>
    using namespace std;
    int main()
    {
    	int *p = new int[10];//没有初始化
    	string *b = new string[10];//默认的构造函数初始化 
    	int *q = new int[10]();//初始化都为0
    	*q = 1;
    	*(q + 1) =2;
        cout << *(q + 6)<< endl; 
        for(int *a = q;a != q + 10;a ++)
        {
        	cout << *a << endl;
        }
        delete[] p;
        delete[] b;
        delete[] q;
        return 0;
    }



    展开全文
  • c++ 动态数组

    2015-06-02 08:18:59
    这学期学C++ ,晚上有道编程题, 比较坑, 感觉要用动态数组做, 但实际就是要用静态数组, 因为动态的反而更难了。  用动态数组的时候,发现自己只会创建一维的 int *a = new int[5] ; 然后二维数组怎么创都...

    这学期学C++  ,晚上有道编程题, 比较坑, 感觉要用动态数组做, 但实际就是要用静态数组, 因为动态的反而更难了。 

    用动态数组的时候,发现自己只会创建一维的 int *a = new int[5] ;   然后二维数组怎么创都忘记了, 还是那句话 ,不写代码很容易

      忘记。 然后下面就给出几个例子吧

    1. <span style="white-space:pre">    </span>int **p = new int*[i];  
    2.       
    1. <span style="white-space:pre">    </span>for (int k = 0; k < i ; k++)  
    2.     {  
    3.   
    4.         p[k] = new int[j];  
    5.     }  
    1.   

    当然创建方式不止是这么一种 。 另外有一点要强调, 有几个new 就要调用几个delete , 不然会造成内存泄露, 然后多为数组还要delete[].............


    还有一点想说的是编程过程的一些问题吧 

    1. 首先是数组的指针表达式   *(*(p+i)+j)   今天居然有同学问我这个怎么写,我也是无语了,感觉这个事必须掌握的啊 
    2.        int **qw = new int[12][23];   这个提示错误

      "int(*)[23]"类型的值不能用于初始化" int * *"类型的实例 ;  很显然是类型不匹配,所以new 不了来了  实际改法也很简单, 就是int (*p)[23] = new int [12][23] ; 

    3 还有一点是在传参数的时候, 二维数组可以**p 做形参, 也可是(*p)[23] 这种格式  




    C++ 中动态数组还是很有用的, 特别是在类当中, 深拷贝这类的 ,还是很值得学习的。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,388
精华内容 4,155
关键字:

c++动态数组

c++ 订阅