字符指针与字符数组真正的区别
字符串的存储形式之间的比较
对于指向常量字符串的字符指针来说,字符指针可以改变指向,但不可以改变字符指针指向的内容
对于指向常量字符串的字符数组来说,字符数组可以改变指向内容,但不可以改变字符数组的指向
对于存放常量字符串的堆区来说,指针的指向和指针指向的内容都可以改变
//字符串的存储形式之间的比较 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { // "hello" 存放在 只读常量区 // pc 指向 只读常量区 // pc本身占用的内存在 栈区 char* pc = "hello"; // "hello" 存放在 只读常量区 // ps指向 栈区 // ps本身占用的内存在 栈区 // 将常量字符串内容 拷贝到 字符数组中 char ps[6] = "hello"; printf("&pc = %p,pc = %p,pc = %s\n",&pc,pc,pc); printf("&ps = %p,ps = %p,ps = %s\n",&ps,ps,ps); printf("-------------------------\n"); //指针变量的指向可以改变 pc = "abcd"; //数组名的指向不可以改变 //ps = "abcd"; error //指针变量指向的字符串内容不可改变 //strcpy(pc,"12345"); error //数组存储的内容可以改变 strcpy(ps,"12345"); printf("&pc = %p,pc = %p,pc = %s\n",&pc,pc,pc); printf("&ps = %p,ps = %p,ps = %s\n",&ps,ps,ps); printf("-----------------------\n"); // pc指向可以变,pc指向堆区, pc本身在栈区 pc = (char*)malloc(sizeof(char)*10); // 堆区的pc指针指向的内容可变 strcpy(pc,"hello"); printf("&pc = %p, pc = %p, pc = %s\n", &pc, pc, pc); // 注意先保存刚申请的(pc)动态内存的地址,因为后面这个地址指向改变了,无法释放 char* pt = pc; // 堆区的pc指针指向可变,pc变成指向了只读常量区 pc = "hello,world"; printf("&pc = %p, pc = %p, pc = %s\n", &pc, pc, pc); //释放动态内存 free(pt); pt = NULL; return 0; }
编译,运行结果:
&pc = 0x7ffeda7db390,pc = 0x400874,pc = hello
&ps = 0x7ffeda7db3a0,ps = 0x7ffeda7db3a0,ps = hello
-------------------------
&pc = 0x7ffeda7db390,pc = 0x4008c8,pc = abcd
&ps = 0x7ffeda7db3a0,ps = 0x7ffeda7db3a0,ps = 12345
-----------------------
&pc = 0x7ffeda7db390, pc = 0x1ced010, pc = hello
&pc = 0x7ffeda7db390, pc = 0x400901, pc = hello,world
参考:http://blog.csdn.net/on_1y/article/details/13030439
http://blog.csdn.net/okliujieko/article/details/6821321
http://blog.sina.com.cn/s/blog_5731c0b30100pgap.html