C++:new用法入门篇

用法1:

   int *a=new int;
   *a=1;
   cout<<"方法一:"; 
   cout<<*a<<endl; 
   delete a; 

加*是取指针指向的内存地址存储的元素,不加*是取指针指向的内存地址

cout<<a<<" "<<(&a)<<endl; 

输出:0x32de0 0x6cfeec,为什么地址不同?

因为这两个指向的不是同一个地址,a是指针指向的地址,&a是指针本身存储的地址,指针本身也是需要占据内存空间的

但其实上面的代码并不规范,因为并没有给指针进行初始化,且听我娓娓道来:

   初始化
   int temp=10; 
   a=&temp;
   cout<<*a<<endl; 
   cout<<a<<" "<<(&a)<<endl; 

输出:10 0x6cfee8 0x6cfeec

这里指针指向了temp,保存了变量temp的地址,*a就是这个地址所保存的int类型元素10,而前面并没有对指针进行初始化(*a=1并非初始化),因为a指针指向的是一个随机地址,这个随机地址若指向合法地址(如其他正在运行程序的地址),随后对其赋值如*a=1,可能会修改一个正在使用的值,所以一定要初始化。

用法2:

   int *b=new int[2];//动态创建数组 
   b[0]=10;
   b[1]=20;
   b[3]=30; 
   cout<<"方法二:"; 
   cout<<b[0]<<" "<<b[1]<<" "<<b[3]<<endl;

这里没有创建b3的空间却可以输出是因为可以C++支持小范围非法内存访问,如果访问越界太大则会导致程序崩溃

也可以这样输出

   cout<<b[0]<<" ";//10
   b++;
   cout<<b[0]<<" ";//20
   b+=2;
   cout<<b[0]<<" "<<endl;//30

用法3(与2做对比):

   int *b1=new int[2];//动态创建数组,与法二做对比 
   *b1=10;
   b1++;
   *b1=20;
   cout<<"方法三:"; 
   cout<<b1[0]<<" "<<b1[1]<<endl;//输出20 未知数据 
   delete b1; 

b1++表示指针指向b1所指的int变量的下一个int型变量地址,这个下一个跨越一整个int型(4个字节) ,所以b[0]输出的不是10而是20,若是b1=b1+i,则说明跨越到当前int型变量之后的第i个int型变量 。

b1[1]输出未知数据的原因是没有进行初始化,内存地址是不断被不同的程序重复使用的,不同的程序使用了这个地址会在这个地址上存储数据,当程序结束时,数据不会立即清除,这个时候就叫做脏数据了(已经过期的、无意义的数据)。定义一个变量,计算机分配地址,正好分配到这个地址上,但是没有初始化变量,也就是没有刷新这个地址上的已有数据,直接使用这个变量时,取到的值就是之前程序存储在这个地址上的值。

用法4:

   int *c=new int[2]();//将元素全部初始化为0 
   cout<<"方法四:"; 
   cout<<c[0]<<" "<<c[1]<<" "<<c[2]<<endl;
   delete c; 

用法5:

   int *d=new int[2]{0,10};//将元素初始化为0,10
   cout<<"方法五:"; 
   cout<<d[0]<<" "<<d[1]<<" "<<endl;
   delete d; 

如果是 int *d=new int[2]{10};则只会给第一个元素赋值 

用法6(与法1做对比):

   int *e=new int(20);
   cout<<"方法六:"; 
   cout<<*e<<" ";
   e++;
   *e=100;
   cout<<*e;

法一没有在创建的时候初始化指针

   int *e=new int[20](20);

这个写法编译不会通过(我也不懂为啥错误,希望有大佬能给我解解惑)。

如果是开辟了数组空间大小,又想要赋值就只能是像用法5那样

完整代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{  /*---------------------------------*/ 
   int *a=new int;
   *a=1;//取指针指向的内存地址存储的元素,不加*是地址 
   cout<<"方法一:"; 
   cout<<*a<<endl; 
   delete a; 
   /*---------------------------------*/ 
   int *b=new int[2];//动态创建数组 
   b[0]=10;
   b[1]=20;
   b[3]=30; 
   cout<<"方法二:"; 
   cout<<b[0]<<" "<<b[1]<<" "<<b[3]<<endl;
   //这里没有创建b3的位置却可以输出是因为可以C++支持小范围的非法内存访问
   //如果下标比较大的话程序就会崩溃 
   //也可以这样输出:
   cout<<b[0]<<" ";//10
   b++;
   cout<<b[0]<<" ";//20
   b+=2;
   cout<<b[0]<<" "<<endl;//30
   delete b; 
   /*--------------------------------*/
   int *b1=new int[2];//动态创建数组,与法二做对比 
   *b1=10;
   b1++;
   //指针指向b1所指的int变量的下一个int型变量地址,这个下一个跨越一整个int型(4个字节) 
   //若是b1+i,则说明跨越到当前int型变量之后的第i个int型变量 
   *b1=20;
   cout<<"方法三:"; 
   cout<<b1[0]<<" "<<b1[1]<<endl;//输出20 未知数据 
   //因为指针的起始位置改变了 
   delete b1; 
   /*--------------------------------*/
   int *c=new int[2]();//将元素全部初始化为0 
   cout<<"方法四:"; 
   cout<<c[0]<<" "<<c[1]<<" "<<c[2]<<endl;
   delete c; 
   /*--------------------------------*/
   int *d=new int[2]{0,10};//将元素初始化为0,10
   cout<<"方法五:"; 
   cout<<d[0]<<" "<<d[1]<<" "<<endl;
   delete d; 
   //如果是 int *d=new int[2]{10};则只会给第一个元素赋值 
   /*--------------法四------------------*/
   int *e=new int(20);
   cout<<"方法六:"; 
   cout<<*e<<" ";
   e++;
   *e=100;
   cout<<*e;
    return 0;
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值