Lv.v

导航

字符指针常量和字符数组

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

 

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

posted on 2012-05-22 10:07  Lv.v  阅读(602)  评论(0编辑  收藏  举报