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 就会出错.

  • 相关阅读:
    20150216 IMX257实现GPIO-查询按键驱动程序
    20150216简单的Linux字符设备驱动程序
    Linux内核驱动编程
    解决安装完centos6.6之后/etc/sysconfig/目录下没有iptables 的问题
    centos6.6安装配置jboss7.1.1
    mysql5.6中 order by 多个字段排序问题
    centos6.6编译安装lnmp系列之PHP
    centos6.6编译安装lnmp系列之nginx
    centos6.6编译安装lnmp系列之mysql
    mysq 安装时候进行生成数据库系统时候执行语句 ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql 时候报错
  • 原文地址:https://www.cnblogs.com/lvpblog/p/2512824.html
Copyright © 2011-2022 走看看