- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
你好,我有一个简单的问题
char *a="abc";
printf("%s\n",a);
int *b;
b=1;
printf("%d\n",b);
为什么第一个有效而第二个无效?我觉得应该是第一个
char *a="abc";
printf("%s\n",*a);
我认为 a 存储“abc”的地址。那么为什么当我打印 a 时它显示 abc?我想我应该打印 *a 以获得它的值(value)。
谢谢
莹
最佳答案
Why the first one works but the second one doesnot work?
因为首先,您不是要求它打印一个字符,而是要求它打印一个以 null 结尾的字符数组作为字符串。
此处的混淆是您将字符串视为与整数和字符相同的“ native 类型”。 C 不是那样工作的;字符串只是指向一堆以空字节结尾的字符的指针。
如果您真的想将字符串视为原生类型(记住它们实际上不是),请这样想:字符串的类型是 char *
,而不是字符
。所以,printf("%s\n", a);
之所以有效,是因为您传递的是 char *
以匹配指示 char *< 的格式说明符
。要获得与第二个示例相同的问题,您需要传递一个指向字符串的指针,即 char **
。
或者,%d
的等价物不是 %s
,而是打印单个字符的 %c
。要使用它,您确实必须向它传递一个字符。 printf("%c\n", a)
会遇到与 printf("%d\n", b)
相同的问题。
来自您的评论:
I think a stores the address of "abc". So why it shows abc when i print a? I think I should print *a to get the value of it.
这就是将字符串作为 native 对象的松散想法落空的地方。
当你这样写的时候:
char *a = "abc";
编译器会存储一个包含四个字符的数组——'a'
、'b'
、'c'
和'\0'
——某处,a
指向第一个,a
。只要您还记得 "abc"
实际上是一个包含四个独立字符的数组,就可以将 a
视为指向那个东西的指针(至少如果您理解数组和指针运算在 C 中是如何工作的)。但是,如果您忘记了这一点,如果您认为 a
指向包含单个对象 “abc”
的单个地址,您就会感到困惑。
引自GNU printf
man page (因为 C 标准不可链接):
d, i
The int argument is converted to signed decimal notation …
c
… the int argument is converted to an unsigned char, and the resulting character is written…
s
… The const char * argument is expected to be a pointer to an array of character type (pointer to a string). Characters from the array are written up to (but not including) a terminating null byte ('\0') …
最后一件事:
您可能想知道 printf("%s", a)
或 strchr(a, 'b')
或任何其他函数如何打印或搜索字符串当没有“字符串”这样的值时。
他们使用的是一个约定:他们接受一个指向字符的指针,并打印或搜索从那里到第一个空值的每个字符。例如,您可以编写一个 print_string
函数,如下所示:
void print_string(char *string) {
while (*string) {
printf("%c", *string);
++string;
}
}
或者:
void print_string(char *string) {
for (int i=0; string[i]; ++i) {
printf("%c", string[i]);
}
}
无论哪种方式,您都假设 char *
是指向字符数组开头的指针,而不是仅指向单个字符,并打印数组中的每个字符,直到您点击空字符。这就是在整个标准库中融入 printf
、strstr
等函数中的“空终止字符串”约定。
关于c - char和int的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16969488/
这个问题在这里已经有了答案: 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"; 使用此编译器会抛出警告“初始化中的指
我是一名优秀的程序员,十分优秀!