zoukankan      html  css  js  c++  java
  • 字符指针常量和字符数组

    学了一年了,还是会在字符指针 指向 常量弄错..今天记下来,提醒自己..

    char* p=new char[7];
    p="ABCDEF";    //1,
    *(p+1)='L';    //2.
    delete p;      //3.

    首先为 p 字符指针变量 分配内存大小为7;

    p指向了常量"ABCDEF",接着,  *(p+1)='L';  就错了,为什么了.

    因为  p 指向了常量,  常量是不可修改的(正常情况下).      VirtualProtect();

    delete p; 接着也错了,为什么了.

    因为 p存放的是常量的指针,而不是刚开始 NEW 出来的指针.....

     在delete的时候,必须是New出来的首地址. 以此警戒...

    #include "stdafx.h"
    #include <string.h>
    #include <iostream.h>

    int main(int argc, char* argv[])
    {
     char* pNew=new char[6];
     char* p="ABCDEF";
     cout<<pNew<<endl;

    /*****************************
    // while((*pNew++=*p++)!='\0');       错误;这样之后 pNew已经指向了末尾.再输出 pNew 是指向末尾的字符 所以是乱码.

    char* p2 = pNew;
    while((*(p2++)=*p++)!='\0');         正解; 之所以用到P2来做中间变量,是因为 p2和pNew 都指向了同一个地址.p2++改变了指向地址的值..但pNew指向的地址并没改变.

                  但是输出 pNew的时候 却是 复制过后的值.  (个人觉得这点不错.)

    /****************************

    // for(int i=0;*(p+i)!='\0';i++)             

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

     {
      *(pNew+i)=*(p+i);
     }
     cout<<pNew<<endl;
     char** str;
     str=&pNew;
     cout<<*str<<endl;
     delete pNew;
     return 0;
    }

    并没有改变指针的指向,只是向指针指向的地址里面付值.

    //----------------------------------以上均为以前的想法,以下是再次体会.

    字符数组和字符指针的一些区别.

    char ch_a[100]={"abcdef"};  相当于 char ch_a[100]={'a','b','c','d',e'','f','\0'}

    char* ch_pa="abcdef";

    ch_a数组不能像 ch_pa指针一样重新赋值.(ch_a="1111";错误) , 而 ch_pa又不能像ch_a数组一样重新赋值.(*ch_pa='1')

    为什么是这样子?  个人体会如下,有错误之处,请多多指教!

    当你在申请一个字符数组时, 首先编译器把你要申请的多少空间给你分配好. 然后,把分配好的空间,第一个地址给了数组名.从此,你就可以向这个空间写数据了.所以了,数组名这个指针是死的,也                                            就说是固定的.我们不能去变动. 我们能变动的是编译器给我们分配的空间的数据.

    当你在申请一个字符指针时, 首相编译器给你分配四个字节的空间. 这样它就可以存放字符串的首地址. 然后了. 你觉得不爽的话, 也可以让字符指针这个变量指向别的字符串地址. 既然说是变量,                                      也就说明,这个量是可以变的(这个理由有点牵强.) 为什么我不能改变指针变量指向的值了? 因为你指向的字符串是常量. 常量也就是不能变的(正常的情况下).

    为了能修改字符指针变量指向的字符串的值. 我们可以用 NEW 来分配内存. 但是记得要 delete . 其实这样子 就和字符数组有点相似了.  再此要提醒一下自己. 当用NEW之后, 如果再直接赋值   的话, delete 就会出错.

  • 相关阅读:
    Postman+Newman+jenkins实现API自动化测试
    抓包,反抓包,反反抓包
    使用Magisk+riru实现全局改机
    stat命令的实现-mysate(必做)
    第五章学习笔记
    第四章学习笔记
    2.3.1测试
    缓冲区溢出
    学习笔记6
    电子公文传输系统团队项目——需求规格说明书
  • 原文地址:https://www.cnblogs.com/lvpblog/p/2512824.html
Copyright © 2011-2022 走看看