gpt4 book ai didi

c - 我不了解C字符串

转载 作者:太空宇宙 更新时间:2023-11-04 06:27:11 24 4
gpt4 key购买 nike

关于C字符串的几个问题:
char*char[]都是指针?
我已经了解了指针,我可以知道char*是指针,但为什么它会自动成为一个字符串,而不仅仅是一个指向1个字符的字符指针;为什么它能保存字符串?
为什么,与其他指针不同,当您为char*指针分配新值时,实际上是在内存中分配新空间以存储新值,而与其他指针不同,您只是替换指针指向的内存地址中存储的值?

最佳答案

指针不是字符串。
字符串是一个具有array of char类型的常量对象,而且它还具有数组的最后一个元素是空字符'\0'的属性,而空字符int又是一个具有整数值char0值(转换为char*类型)。
char[]是指针,但char[]不是。类型char[]不是“真实”类型,而是不完整类型。C语言的指定方式是,当您定义一个具有char类型数组的具体变量(对象)时,数组的大小是以某种方式确定的。因此,没有一个变量具有类型array of N objects of type char,因为这不是一个类型(对于给定对象)。
但是,每个char *类型的对象都会自动升级为sizeof(),即指向指向数组初始对象的char的指针。
另一方面,这种晋升并不总是执行的。例如,运算符char*an array of N chars的结果与对pointer to char的结果不同。在前一种情况下,给定achar*的大小(通常每个指针的大小相同…),在最后一种情况下,给出N值,即数组的大小。
当您将函数参数声明为char[]char *时,行为是不同的。由于函数无法知道数组的大小,因此可以将这两个声明视为等效声明。
实际上,您就在这里:array of N chars是一个只指向一个字符对象的指针。但是,它可以用来访问字符串,我现在将向您解释:在第1段中。我向您展示了字符串被视为内存中的对象,对于某些N,它的类型为char*。这个值N足够大,允许以空字符结尾(因为所有“字符串”都应该在C中)。
那么,这是怎么回事?
理解这个问题的关键是对象(在内存中)的概念。
当您有一个字符串,或者更一般地说是一个char数组时,这意味着您已经找到了某种方式来将数组对象保存在内存中。
这个对象决定了可以安全访问的RAM内存的一部分,因为C为它分配了足够的内存。
因此,当您用一个char*变量指向这个对象的第一个字节时,实际上您已经保证可以访问该内存位置“右边”的所有相邻元素,因为这些位置被C定义为具有上面数组的字节。
简而言之:可以访问由s1变量指向的字节的相邻(右边)字节,它们是可以访问的有效位置,因此可以“迭代”指针来遍历这些字节,直到字符串的末尾,而不存在“风险”,因为数组中的所有字节都是内存中连续的、定义良好的位置。
这是一个复杂的问题,但它揭示了您没有理解C语言中指针、数组和字符串文本之间的关系。
指针只是指向内存中某个位置的变量。
到char的pòinter只指向一个char类型的对象。
如果指向位置的相邻字节对应于一个字符数组,则指针可以访问这些字节,因此指针可以“遍历”数组对象占用的内存字节。
字符串文字被视为char对象的数组,它隐式地添加值为0(空字符)的结束字节。
在任何情况下,T对象数组都有一个定义良好的“大小”。
字符串文本有一个附加属性:它是一个常量对象。
试着把这些概念整合到你的脑海中,找出到底发生了什么。
请我澄清一下。
附加说明:
请考虑以下代码:

#include <stdio.h>
int main(void)
{
char *s1 = "not modifiable";
char s2[] = "modifiable";
printf("%s ---- %s\n\n", s1, s2);
printf("Size of array s2: %d\n\n", (int)sizeof(s2));

s2[1] = '0', s2[3] = s2[5] = '1', s2[4] = '7',
s2[6] = '4', s2[7] = '8', s2[9] = '3';
printf("New value of s2: %s\n\n",s2);
//s1[0] = 'X'; // Attempting to modify s1
}

"not modifiable"的定义和初始化中,我们有字符串literal s1,它具有常量内容和常量地址。它的地址被分配给指针 s2作为初始化。
任何修改字符串字节的尝试都会产生某种错误,因为数组内容是只读的。
"modifiable"的定义和初始化中,我们有字符串literal s2,它同样具有常量内容和常量地址。但是,现在发生的是,作为初始化的一部分,字符串的内容被复制到char s2数组中。数组 char s2[]的大小没有指定(声明 "modifiable"给出了一个不完整的类型),但是在初始化之后,数组的大小被很好地确定并定义为复制字符串的确切大小(加上用于保存空字符或字符串结束标记的1个字符)。
因此,字符串文本 s2用于初始化数组 <string.h>的字节,这是可修改的。
正确的做法是在那个时候改变一个角色。
为了更方便地修改和分配字符串,必须使用标准头

关于c - 我不了解C字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25578012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com