字符指针与字符数组真正的区别

字符串的存储形式之间的比较

对于指向常量字符串的字符指针来说,字符指针可以改变指向,但不可以改变字符指针指向的内容 

对于指向常量字符串的字符数组来说,字符数组可以改变指向内容,但不可以改变字符数组的指向

对于存放常量字符串的堆区来说,指针的指向和指针指向的内容都可以改变

//字符串的存储形式之间的比较
#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

posted @ 2017-05-19 14:48  大海中的一粒沙  阅读(370)  评论(0编辑  收藏  举报