C++new的用法(涉及指针)

首先,new和delete是成对使用的,new用于从堆内存申请一块空间,一般动态用于动态申请内存空间,即根据程序需要,申请一定长度的空间,而delete则是将new申请的空间释放。

new开辟的空间在堆上,而一般声明的变量存放在栈上。

一.new申请内存空间的三种基本格式

  • new 数据类型

  • new 数据类型(初始值)


  int  * p1=new int;

  int  *p2=new int(2); // *p2初始化值是2,这样直接在定义后面初始化是可以的
//也可以单独赋值  *p2=2;

 //如果不想使用指针,可以定义一个变量,在new之前用“*”表示new出来的内容
  int q = *new int;
  q = 1;
  cout << q << endl;

  int  *p3=new int[1000] //申请1000个单位内存空间

因为系统资源有限。

所以一般申请完后加一个条件进行判断(一般情况 不需要,申请特别大的内存时需要)


void Test()

{
 if(p3!=null)

{

   //程序代码
}

else

{

  //抛出异常,内存空间申请失败
}
 
}

用完以后记得删除

注意:只可以删除一次,不要对同一个指针多次使用delete


 delete p0;  //错误的,p0指针不是用new动态申请的
//下面三个是正确的写法

 delete p1;

 delete p2;

 delete[] p3; //注意此处不能用delete p3,因为在申请用了[],则在释放时要用delete[]
//注意   []中什么也不写

}

二.使用new来创建动态数组


int main()
{
using namespace std;
double* p3=new double[3];
p3[0]=0.2;//把指针当做数组名去使用即可,C++将数组名解释为数组第一个元素的地址
p3[1]=0.5;
p3[2]=0.8;
p3=p3+1;//对于数组名来说,是一个常量,不可以进行加减运算,但对于指针来说是个变量,于是可以。

//注意,因为上述操作使得p3指向了数组的第二个元素的地址,而在接下来需要删除时应该从首地址删除,所以需要-1操作(或者提前用一个指针标记好首地址以便后续删除操作)


p3=p3-1;
delete []p3;
return 0;

}

小插曲:

在对于两个指针指向字符串,需要复制时,应该使用strcpy函数

常常用于字符串char数组的初始化


strcpy(ps,animal);//将animal指向的字符串内容粘贴至ps所指字符串(需要提前确保内存空间足够)

strncpy函数,此函数会接受第三个参数,即复制的字符数


strncpy(ps,animal,19);

注意,这里我们假定ps数组长度为20,animal数组长度大于20,由于后者长度超过前者,若不加限制strncpy函数不会在最后一位加入'\0',因此,需要设置长度为19


ps[19]='\0';//手动补全空字符

警告:应该使用strcpy()或strncpy()而不是赋值运算符你来将字符串复制给数组


//strcpy
strcpy(p,"Hello");
cout<<*p<<endl; //只是输出p指向的字符串的第一个字符!
cout<<p<<endl; //输出p指向的字符串!
delete[] p;

一维: int *a = new int[100];//开辟一个大小为100的整型数组空间

二维: int **a = new int[5][6]

三维及其以上:依此类推.

一般用法: new 类型 [初值]

若数组大小是不确定的,可以如下操作


#include <iostream>
using namespace std;

int main()
{
    int size;
    cout << "Enter the size of the array: ";
    cin >> size;
    int *p = new int[size];
    // Use the array
    delete[] p;
    return 0;
}

典例应用


#include<iostream>
#include<cstring>
using namespace std;
char* getname();
int main()
{
char*name;
name=getname();
cout<<name<<"at"<<(int*)name<<"\n";
delete[]name;
name=getname();
cout<<name<<"at"<<(int*)name<<"\n";
delete[]name;
return 0;
}
char* getname()
{
char temp[80];
cout<<"Enter last name";
cin>>temp;
char* pn=new char[strlen(temp)+1];
strcpy(pn,temp);
return pn;

}
注意:

在使用动态数组时,你需要自己确保数组大小是合法的,并需要自己确保动态分配的内存能够被释放。

为了避免内存泄露,您应该在异常发生时删除动态分配的内存。

同时,一个常见的误区是:

sizeof 函数在 C++ 中用于获取一个变量或类型的大小,但它不能用来获取动态数组的长度。因为动态数组的大小是在运行时分配的,而 sizeof 是在编译时进行的。

如果要获取动态数组的长度,可以在创建数组时顺便记录下来,或者在调用 new 时传入一个变量来记录数组大小。

如:


int size = 10;
int *p = new int[size];
// do something with the array
cout << "The size of the array is: " << size << endl;


//or


int size;
cout << "Enter the size of the array: ";
cin >> size;
int *p = new int[size];
// do something with the array
cout << "The size of the array is: " << size << endl;
    • 用new来开辟数组空间

    举个例子,如果你想创建一个 int 类型的 vector,可以这样写:

    
    #include <vector>
    using namespace std;
    
    int main()
    {
        vector<int> v;
        // Use the vector
        cout<<"The size of vector is: "<<v.size()<<endl;
        return 0;
    }

    vector 内部维护了元素的个数,而不必手动记录。

    当需要向 vector 中添加元素时,可以使用 push_back() 函数:

    
    v.push_back(1);
    v.push_back(2);

    这样就可以在运行时获取动态数组的大小,而不必使用 sizeof 函数。

    vector 比动态数组更安全,因为它维护了大小信息,而且自动释放内存,避免了内存泄露。

    需要注意的是,vector 在空间不够时会自动重新分配内存,这意味着指向 vector 内存块的指针可能会发生改变,因此不能将 vector 的指针存储在指针数组中。

    三.用new来创建动态结构

    基本格式:

    
    inflatable* ps=new inflatable;

    注意:由于用这种方式创建的结构没有名称因此无法使用"."来获取成员函数

    因此我们需要使用"->"运算符

    如:

    
    ps->price;//被指向的结构的price成员

    简单来讲:如果使用的是结构名。就用"."

    如果是指针,就用“->”

    (记得delete)

    To be continued......

      • 还有个方法就是使用STL中vector,因为vector封装了new和delete,它本身维护了大小,我们可以直接使用 vectorName.size()来获取。
      • STL 中的 vector 是一种动态数组,它提供了与动态数组类似的功能,但是还提供了一些额外的特性,如随着元素数量增加而自动增长数组的大小。

  • 11
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 在C语言中,可以使用new关键字来动态地分配指针数组的内存空间。例如,可以使用以下代码来创建一个动态指针数组并初始化其值: ``` int* p = new int = 1; p = 2; p = 3; ``` 在这个例子中,我们使用new关键字创建了一个包含3个整数的动态指针数组,然后分别给数组元素赋值为1、2和3。注意,这里的p是一个指针,指向了整数数组的首地址。在使用完数组后,我们应该使用delete[]来释放内存空间,以防止内存泄漏。 需要注意的是,以上的示例是C++语言的写法。在C语言中,使用动态指针数组的方法可能会有所不同。一种常见的方法是使用malloc函数来分配内存空间,例如: ``` int* p = (int*)malloc(3 * sizeof(int)); p = 1; p = 2; p = 3; ``` 在这个例子中,我们使用malloc函数来分配了包含3个整数的内存空间,并将返回的指针强制转换为int类型的指针。同样,在使用完数组后,我们应该使用free函数来释放内存空间,以防止内存泄漏。 总而言之,C语言中可以使用malloc函数动态分配指针数组的内存空间,而C++语言可以使用new关键字来实现相同的功能。注意在使用完动态分配的数组后,应该使用相应的释放内存的函数来避免内存泄漏。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C++new用法涉及指针)](https://blog.csdn.net/holdon_yes/article/details/128670543)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [C++ 指针(一)](https://blog.csdn.net/weixin_45610907/article/details/127452356)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值