C字符数组与字符指针的区别

C字符数组与字符指针的区别,c,arrays,string,pointers,char,C,Arrays,String,Pointers,Char,我刚刚开始学习C语言,一直在阅读K.N.King关于编程语言的教科书。在关于字符串的一章中,他指出字符数组和字符指针在传递到函数方面几乎相同。但是,它们是不可互换的,这背后的原因之一是可以修改字符数组中的字符,而字符指针指向字符串文字。然而,在他早期的教科书中,他指出C将字符串文本存储为一个字符数组,所以这不会使字符指针和字符数组相同吗 提前谢谢你 当您声明这样的字符数组时: char str[]="My String"; 然后,如果堆栈内存中的数组未声明为全局数组,则为其分配内存。在堆栈内存

我刚刚开始学习C语言,一直在阅读K.N.King关于编程语言的教科书。在关于字符串的一章中,他指出字符数组和字符指针在传递到函数方面几乎相同。但是,它们是不可互换的,这背后的原因之一是可以修改字符数组中的字符,而字符指针指向字符串文字。然而,在他早期的教科书中,他指出C将字符串文本存储为一个字符数组,所以这不会使字符指针和字符数组相同吗


提前谢谢你

当您声明这样的字符数组时:

char str[]="My String";

然后,如果堆栈内存中的数组未声明为全局数组,则为其分配内存。在堆栈内存中,可以修改数组的内容

但当您声明一个指向字符串的指针并通过指定一个字符串来初始化它时,如:

char *ptr="My string";
然后,它为堆栈内存中的指针分配内存,但它保留代码内存中的字符串地址,您无法修改该地址


但是,由于您使用的是指针,而不是常量指针,并且它存储在堆栈中,因此您可以修改该指针,这意味着您可以将它指向另一个内存,您正在更改指针本身的内容。但是,您不能更改它指向的内存的内容,因为它指向只读内存

类似:和字符串文本存储在字符串表(ro区域)中,并将返回常量指针,因此您无法编辑字符串文本。指针只指向字符串,试图用指针修改字符串是非法的。尽管访问字符与指针和数组类似。数组为其内容提供了存储空间,而指针正好指向这些内容。指向字符串文字的指针类似于全局数组中的
const char array\u name[]=“string literal”
。这只是一个快速参考。请浏览其他人提到的上述链接@InfiniteLop不幸的是,字符串文字的类型为
char*
(不含
const
),修改它们只是未定义的行为,因此编译器可以自由地将它们放入只读内存中,大多数编译器都是这样做的,但它们不是必需的。@FelixPalmen,我认为它们是从const char*隐式转换为char*(当然,现在不赞成使用显式强制转换,使用显式强制转换是一种很好的做法)赋值时,字符串文字至少返回我所知的
const char*
。如果不正确,请纠正我wrong@infiniteloop事实上,这是错误的。嗯,给字符串文本指定类型
const char*
是很有意义的,但事实并非如此。顺便说一句,强制转换在标准方面总是显式的,你的意思是转换…但从来没有隐式转换删除
常量
限定符。C标准只是说写入字符串文字是未定义的行为。如果您知道目标系统甚至不知道只读内存,您可以写入字符串文字(当然仍然是UB)“为堆栈内存中的数组分配内存”-->可能。当
str
是一个全局数组时,我不希望出现这种情况。IAC、C不需要使用此堆栈。“在无法修改的代码内存中”-->关闭。如果尝试修改,它可能“工作”,也可能不工作。它是UB。