字符串常量

当一个字符串常量出现在表达式中时,它的值是指针常量。编译器把该字符串的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针。我们可以对字符串常量进行下标引用、间接访问以及指针运算。

 字符串常量实际上是个指针, “xyz”+ 1这个表达式计算指针值加上 1的值。它的结果也是个指针,指向字符串中的第 二个字符 y

如果使用语句printf("%s", “*xyz"+1); 则输出结果为"yz"

  *“xyz”– 对一个指针执行间接访问操作时,其结果就是指针所指向的内容。字符串常量的类型是指向字符的指针,所 以这个间接访问的结果就是它所指向的字符:x。注意表达式的结果并不是整个字符串,而只是它的第一个字符。

“xyz”[2]

同样可以推断出上面这个表达式的值就是字符 z

在 ANSI C 中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串值,程序会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。

 数组也可以用字符串常量进行初始化:

char a[] = "gooseberry";

与指针相反,由字符串常量初始化的数组是可以修改的。比如下面的语句:

strncpy(a, "black", 5 );

将数组的值修改为blackberry

#include
#include
int main(void)
{
    char *p = "this is a example";
    //char *pi = 3.14; //这样定义是错误的,无法通过编译
    //p[0] = 'T'; //修改该字符串常量时,编译是没问题,但是运行时会出现异常
     
    char a[] = "gooseberry";
    strncpy(a, "black", 5 );
     
    printf("%s\n", p );
    printf("%s\n", a );
    return 0;
}

以上内容摘自《和指针P269。

关于char *p 及数组形式初始化为什么会不同,老刘用objdump了一下,看一下这个,应该就豁然开朗了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

124 views 暂无评论