- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 C 语言中,字符 * 使变量成为指针。因此,人们会假设某个变量 char* 将是指向字符的指针,但不知何故它可以成为字符数组。这怎么可能?
最佳答案
术语“字符串”和“指向字符串的指针”在 C standard 中定义。 , 7.1.1 第 1 段:
A string is a contiguous sequence of characters terminated by and including the first null character. The term multibyte string is sometimes used instead to emphasize special processing given to multibyte characters contained in the string or to avoid confusion with a wide string. A pointer to a string is a pointer to its initial (lowest addressed) character. The length of a string is the number of bytes preceding the null character and the value of a string is the sequence of the values of the contained characters, in order.
(该链接指向 n1570.pdf
,这是 2011 年 ISO C 标准的最新公开草案。)
C 中没有字符串类型。字符串是一种数据格式,而不是数据类型。字符串通常存储在 char
数组中。
对于指向字符串的指针,正如标准所说,这是指向其第一个字符的指针。 C 通常通过指向数组各个元素的指针来处理数组。指针算术让我们可以通过数组的连续元素推进指针。 (某些语言允许您将数组作为整个对象来处理;在 C 中您无法轻松做到这一点。)
一些资料会告诉您数组实际上是指针,或者 char*
是一个字符串。这些消息来源都是错误的。数组不是指针,指针也不是数组。造成这种困惑的原因是数组通常使用指针进行操作,并且特殊的语言规则规定数组表达式“转换”为指向数组初始元素的指针。但这种转换(实际上是编译时调整)仅适用于数组表达式,而不适用于数组或指针对象。另一个令人困惑的来源是数组参数被“调整”为指针类型;例如 void foo(int n[10])
实际上意味着 int foo(int *n)
。
char*
永远不会“变成”char
数组,但想要操作 char
数组的代码可以因此,通过可以前进以指向该数组的连续元素的 char*
指针。 char[]
数组可能包含也可能不包含字符串,具体取决于它是否包含所需的终止空字符'\0'
。
推荐阅读:comp.lang.c FAQ ,特别是第 6 节。
关于c - char*如何映射到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46249050/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
当我尝试运行以下代码时,List(.of) 无法编译并给出主题错误。 package collections; import java.util.LinkedHashSet; import java.
我正在尝试编译使用 ChatScript 库的程序。这是我在名为 main.cpp 的文件中的代码: #include #include "common.h" using namespace std
我想在我的程序中外部使用 ChatScript。在documents它说: Embedding Step #1 First, you will need to modify `common.h and
假设我有一个 char,我想用一行代码将其 strcat() 转换为 char 数组。对于 [一个非实用的] 示例: strcat("ljsdflusdfg",getchar()); 或者我想做相反的
我有以下类型签名: *Main Lib> let f :: a -> a -> a -> a; f = undefined *Main Lib> let x :: Char; x = undefin
我正在学习如何在 C 中使用指针(使用 malloc 和 free),但我在这个练习中遇到了一些麻烦。我只想制作一个指针数组,我想在其中保存每个单词的方向。然后我想为一个特定的词做一个 free(),
我有一个字符*: char* version = "10.5.108"; 我想通过字符分隔符获取两个新的 char*。 char delimiter = '.'; 执行以下代码后: printf("|
最近在学习Cpp,今天在学习使用Clion做测试的时候,发生了奇怪的事情。 这是我的代码 int main() { char c = 'b'; char carr[1]{'a'};
我对 c 很陌生,我正在审查一些代码。我遇到了这个: static char * fromDataType; static char * toDataType; static char * fromR
我有一个像这样的动态结构: struct network { int count; char** ips; } 如果我知道每个字符串数组都是 16 个字节(即 INET_ADDRSTR
我有一个旧程序,其中使用了一些库函数,但我没有那个库。 所以我正在使用 C++ 库编写该程序。在那个旧代码中有一些函数是这样调用的 *string = newstrdup("这里有一些字符串"); 字
我正在编写一个函数,该函数接受 ArrayList,然后将每个 char[] 复制到另一个增加长度的 char[] 中,然后将新的 char[] 添加到新的 ArrayList 中。当我尝试复制数组时
我正在寻找 map >并生成每个可能的 map从它。 我知道这可能会占用大量内存并需要一些时间。 每个map需要包含每个字母 a-z,并映射到唯一的 a-z 字符。 IE。啊bjcp迪EVfh嘎血红蛋
#define NAME_LEN 20 #include "stdio.h" #include "stdlib.h" #include "string.h" #pragma warning(disab
所以我必须创建一个函数来找到一对带有第一个字母并返回第二个字母的函数。 我实际上找到了一个答案,但是使用 map 功能却找不到。 lookUp :: Char -> [(Char, Cha
我最近接受采访并要求写mystrcat(*s1, *s2, *s3) 其中s1 和s2 是源字符串连接结果由 s3 给出。有人告诉我,不要担心 s3 的内存分配,并假设 s1 和 s2 不是空/无效字
今天我与一位同事讨论了他(对我来说)不寻常的“main”函数签名。他喜欢这样声明: int main(int argc, char* (*argv)[]) { printf("at index
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: What's the difference between new char[10] and new cha
通常字符串文字是 const char[] 类型。但是当我把它当作其他类型时,我得到了奇怪的结果。 unsigned char *a = "\355\1\23"; 使用此编译器会抛出警告“初始化中的指
我是一名优秀的程序员,十分优秀!