字符指针常量和字符数组
学了一年了,还是会在字符指针 指向 常量弄错..今天记下来,提醒自己..
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 就会出错.