C++有关数组和指针,内存管理

  

2、char数组
   (1)打印char数组的名字即打印数组的内容
   (2)对于字符数组,'\0'是结束标志 
        字符 '\0' = 数组0  可以认为字符'\0'的ASCII码就是0
        要保存5个字符,就要把字符数组长度声明为6
  
   (3)strcpy()和memset()
        给一个字符串数组赋值 strcpy(),自动为字符串补 '\0'
        在使用strcpy之前,要调用memset(str,0,sizeof(str));初始化一片内存
                                   str  ->   初始化内存的起始位置
                                   0    ->   初始化的值 (初始化为0,清除垃圾数字)
                           sizeof(str)  ->   初始化空间的大小
    (4)strlen(str)
       计算实际存储的字符个数,不包括'\0'
   
    (5)strcmp(str1,str2)
       比较2个字符串是否相等
       实际比较的两个字符串的ASCII码的大小,返回0则内容一样
      
    (6)字符串的拆分  strtok(a,b);
       a、被拆分的字符串名字,当此处是NULL时,表示要拆分的不是新串
       b、分隔符号
       此函数调用一次,拆分一次
       当此函数返回NULL时,则表明拆分完毕
      
       "Hello World"叫字符串常量,存储在data数据区里,类型就是char*
           其值是一个地址,指向数据区里的一块空间
           数据区里的空间保存的内容就是"Hello World"
      
       char line[50];
       strcpy(line,"1:liucy:20:male");
      
       char *p = strtok(line , ":");  //p指针指向的变量
       cout << p << endl;
       while(p != NULL){
           p = strtok ( NULL , ":" );
           cout << p << endl;
       }
      
      
    (7)  strcpy(name,"1234"); //name是个变量,可以改变
           strcpy(p,"1234"); //p是个指针,指向一个字符串,是常量,不能改变 
           p = "1234"; //这样是正确的
           指针指向的是常量,不能通过指针改其值,若指向变量,则可以通过指针改变变量的值
          
    (8)字符串连接 strcat(sub,"world");
         连接条件:sub字符串数组的剩余长度要大于连接的字符串长度
        
         char *p = "Hello";
         strcat(p,""World); //error 指针指向一个常量,不能改变,所以指针后面不能添加东西
        
3、通过指针传递参数
   通过传递地址。改变变量的值
       
        #include <iostream>
        using namespace std;

        void fn (int *pa){
           *pa = 2 * (*pa);  //*pa是指针pa指向的变量的值,在此做的操作,会对变量造成永久的改变
        }

        int main(){
           int a = 100;
           fn(&a);          //把a的地址传个fn函数
           cout << a << endl;
           return 0;
        }
       

5、内存管理
   堆(heap):动态的内存申请与释放
   堆空间不能通过像( 数据区,栈)变量访问空间,要使用指针保存地址
  
   (1)堆空间的管理  new / delete
        new int
        new Person
       
        new 操作符返回值是地址,用指针保存
        int *p = new int;  //在堆空间中申请4个字节
        *p = 100;          //赋值
        delete p;          //释放空间
       
    (2)动态申请空间,对内存的使用变的方便,能更好的控制对内存的占用
         动态内存的指针不能重复赋值,这样会造成内存丢失
         释放空间后,还可以通过指针访问原来的数据。
         释放空间后,还可以再次通过指针赋值,释放的意思就是表示曾经申请的内存的标记位更改,别人可以使用
         这样会造成过期的指针更改重要数据,建议在释放指针以后 ,把指针赋值为NULL ,确保数据安全
         delete p ;
         p = NULL :
        
     (3)在申请空间的同时初始化
        int *p = new int(123);  申请4个字节大小,保存数字“123” 
       
    (4)int *p = new int[10];  一次在堆里申请10个int,并且申请的内存是连续的。
        *(p+1) , p[1]  都能取到下一个数据
        此时的*p就是第一个元素的值
        在释放的时候 delete[] p;  p = NULL; 确保释放的是多个指针 
       
     (5)在堆空间里申请结构
        Person *p = new Person;
        p->id = 1;
        // (*p).id = 1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值