A): char *pc = new char[10];
这是动态内存分配,系统自动在内存中的栈区分配一个4个字节的空间作为指针变量pc的空间1,然后去堆区申请了一个存10个字符的10个字节的空间2,然后返回这个空间2的地址,这个地址值存到了pc变量的空间1中;这个在堆上申请的10个char的空间,程序运行时候一直存在除非你delete []pc
B): char arc[10]
这个得看你在哪定义的;
首先,如果在全局空间定义的,存放在全局静态存储区域,并且会自动初始化元素值为0。
其次,如果是在函数内定义存放在堆栈上,不会自动初始化,在函数使用完后系统自动释放。
char *pc = new char[10]; pc是个指针, pc值可以改变例如 pc = pc + 1;
char arc[10]是数组名字, arc值不可以改变,例如arc = arc + 1是非法的!
C):注意的是,
char *pc="abcdef";声明一个指针,pc在栈,“abcdef”在静态数据存储区,不可写,pc存储的是“abcdef”的首地址,pc指向“abcdef”;
char arc[]="abcdef";在局部定义的话,声明了一个字符串数组,arc在栈,“abcdef”在栈区,数据可以修改重写;
另外:注意字符数组赋值的的几种方式
char arc1[] = {'c', '+', '+'}; // 尾部无null
char arc2[] = {'c','+','+','\0'}; // 显示添加null
char arc3[] = "c++"; // 自动添加null
一般我们拿来一个刚声明的字符数组,在用之前都会先初始化一下,如:
memset(pc, 0, 10 * sizeof(char));
或者 arc[10] = { 0 }; or memset(arc, '', sizeof(arc))
注:
sizeof(pc) : 4
sizeof(*pc):1
sizeof(arc) : 10
sizeof(arc[0]):1