C++日记——Day2:for语句、动态内存分配、栈和堆、new和delete、nullptr

 for语句

int v[] {12, 13, 15, 17};
for (auto x:v){
    cout << x << endl;
}

//-----------------------------------------------------------


for (auto x:{12, 13, 15, 17}){
    cout << x << endl;
}

//-----------------------------------------------------------
int v[] {12, 13, 15, 17};
for (auto &x:v){      //&x可以直接操作数组中的元素,省去了拷贝动作
    cout << x << endl;
}

1、visual studio 快捷键:加断点f9、运行调试f5、执行下一步f10、查看变量shift+f9

 

动态内存分配问题:

程序使用的存储空间:

C中程序区、静态存储区、动态存储区。

C++中我们把内存分为5个区:

①栈:一般函数内的局部变量都会放在这里,由编译器自动分配和释放。

②堆:程序员malloc/new分配,用free/delete来释放。忘记释放后,系统会回收(在程序结束时,系统才会回收)。

③全局/静态存储区:全局变量和静态变量static。程序结束时系统释放。

④常量存储区:“I Love China”

⑤代码区:

 

栈和堆的区别:

①栈:空间有限。系统规定 int a = 4;分配速度快,程序员无法控制。

class A {

};

int main(){
    A a; //这个变量的内存分配再栈上
}

②堆:只要不超出实际拥有的物理内存,也在操作系统允许你能够分配的内存大小之内,都可以分配给你。

          分配速度较慢,可以随时用new/malloc来分配,free/delete来释放,非常灵活。

          在C中使用malloc与free,malloc()与free()是函数

          一般形式:

class A {

};

int main(){
    A pa = new A(); //这个变量的内存分配再堆上
}

malloc(memory allocation)

void *malloc(int NumBytes)  //void * 表示万能的指针,NumBytes表示要分配的字节数。
                            //若分配成功则返回被分配的内存指针,分配失败则返回NULL。
                            //当这段分配的内存不适用时,应使用free()函数来释放,供其他地方 
                            //使用
void free(void *FirstByte)  //将之前malloc分配的内存空间还给程序,也就是释放了这块内存,这
                            //这样内存就被系统回收,并在需要的时候有系统分配出去再给其它释 
                            //放

//-----------------------------------------------------------------------------

int *p = NULL;                  //C语言写法
p = (int *)malloc(sizeof(int)); //正常情况下malloc()返回的是一个(void *)的指针,所以在赋
                                //给p时需要强制转换一下

if(p != NULL){
    //分配成功
    *p = 5;
    cout << *p << endl;
    free(p);
}

//--------------------------------------------------------------------------

int *p = NULL;                  //C语言写法
p = (int *)malloc(sizeof(int) * 100); //正常情况下malloc()返回的是一个(void *)的指 
                                      //针,所以在赋
                                //给p时需要强制转换一下
if(p != NULL){
    //分配成功
    int *q = p;
    *q++ = 1; //相当于*(q++); 即:*q = 1 , q++ 因为q是整型,所以q+1相当于q指针从首地址 
               //向后移动4个字节
    *q++ = 5;
    cout << *p << endl;
    free(p);
}

//---------------------------------------------------------------------------

char *point = NULL;
point = (char *)malloc(100 * sizeof(char))
if (point != NULL){
    strcpy(point, "hello world!"); //当要拷贝的字符串超过point所指向的空间时不会报警,会            
                                   //继续覆盖掉超出范围的部分
    strcpy_s(point, 100, "hello world!"); //第二个参数用来指定,要拷贝字符串所能占用的最 
                                          //大空间,超出空间后会报警
    cout << point << endl;
    free(point);
}

 

C++中使用new与delete

new与delete是标识符,C++中使用new/delete分配和释放内存,不再使用malloc和free分配和释放内存。除了分配和释放内存,new和delete还干了更多的事情。

new的一般使用格式:

①指针变量名 = new 类型标识符;

②指针类型名 = new 类型标识符 (初始值)

③指针类型名 = new 类型标识符 [内存单元个数]

int *myint = new int; //相当于int *p = (int *)malloc(sizeof(int));
if (myint != nullptr){
    *myint = 8;
    cout << *myint << endl; //输出8
    delete myint;
}

//-------------------------------------------------------------------

int *myint = new int(18);
if (myint != nullptr){
    cout << *myint << endl; //输出18
    delete myint;
}

//------------------------------------------------------------------

int *pa = new int[100];
if(!pa != nullptr){
    int *q = pa;
    *q++ = 12;
    *q++ = 18;
    cout << *pa << endl; //12
    cout << *(pa+1) << endl; //18
    delete[] pa; //new的时候用了[],那么释放的时候就必须用[],[]不写数组大小
}

补充:

①配对使用有new必然有delete;

②free/delete不要重复调用;

 

nullptr代表空指针

char *p = NULL;    //NULL实际就是0
char *q = nullptr;
int a = nullptr;  //不可以
int b = NULL;     //可以

if(p == nullptr){
    //成立
}

if(q == NULL){
    //成立
}

//使用nullptr能够避免在整数和指针之间发生混淆

cout << typeid(NULL).name() << endl;      // int
cout << typeid(nullptr).name() << endl;   // std::nullptr t

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值