趣学 C 语言(四)—— 字符串与字符数组

char *ps1 = "hello";
                    // 字符串
                    // ps1 ⇒ 类型为 char*
                    // const char * 
char ps2[] = "hello";
                    // 字符串
                    // ps2 ⇒ 类型为 char[6]
                    // char* const 

两者最根本的区别在于,ps1指向的这个字符串是个常量, 不可改变,程序在编译期间就为"hello"这个字符串分配了固定的空间,它被存储在全局静态区中。

ps2是个变量, 其内容可以被更新和改变, ps2可以理解为一个不可改变其指向位置的指针, 即char * const ps2, 它所占用的内存在程序运行时被自动分配和释放, 而p1占用的内存要等到整个程序结束时才被释放。

#include <stdio.h>
int g; // 存储在全局静态区
int main()
{
    char* ps1 = "hello"; // 和g一样
    char ps2[] = "hello"; // 堆栈中
    printf("%x %x %x", &g, p1, p2);
    return 0;
}

你可以看出ps1g的位置距离很近, 而和ps2相隔很远, 可以看出他们的确是被存储在不同的内存空间中的。

你可能感兴趣的:(趣学 C 语言(四)—— 字符串与字符数组)