C 为什么字符字符串中没有解引用运算符?
假设我有两个函数:C 为什么字符字符串中没有解引用运算符?,c,dereference,C,Dereference,假设我有两个函数: void function1(int *ptr) { printf("%d", *ptr); } 及 在str之前没有遵从操作符的情况下,函数2为什么工作?在str中,只有地址指向值,而不是我认为的值 在以前没有遵从操作符的情况下,函数2为什么工作 str 因为标准定义的%s需要字符*,即地址 7.21.6.1 如果不存在l长度修改器,则参数应为指向 字符类型数组的初始元素。人物 从数组写入(但不包括)到 终止空字符。如果规定了精度,则不再 比写入的字节还要多。如
void function1(int *ptr) {
printf("%d", *ptr);
}
及
在str
之前没有遵从操作符的情况下,函数2为什么工作?在str
中,只有地址指向值,而不是我认为的值
在以前没有遵从操作符的情况下,函数2为什么工作
str
因为标准定义的%s
需要字符*
,即地址
7.21.6.1
如果不存在l长度修改器,则参数应为指向
字符类型数组的初始元素。人物
从数组写入(但不包括)到
终止空字符。如果规定了精度,则不再
比写入的字节还要多。如果精度未规定或
大于数组大小时,数组应包含空字符
在以前没有遵从操作符的情况下,函数2为什么工作
str
因为标准定义的%s
需要字符*
,即地址
7.21.6.1
如果不存在l长度修改器,则参数应为指向
字符类型数组的初始元素。人物
从数组写入(但不包括)到
终止空字符。如果规定了精度,则不再
比写入的字节还要多。如果精度未规定或
大于数组大小时,数组应包含空字符
因为当使用
printf
时,指向字符的指针是特殊的。它不是将其视为指向单个字符的指针,而是将其视为指向NUL
分隔字符数组中第一个元素的指针,打印字符串而不仅仅是指针。因为当使用printf
时,指向字符的指针是特殊的。它不是将其视为指向单个字符的指针,而是将其视为指向NUL
分隔字符数组中第一个元素的指针,打印字符串而不是指针。在C中引用字符串的方式是通过其第一个字符的地址。读取字符串的函数将读取此地址的字节,并对其进行处理(例如,在printf()
的情况下,将其打印),然后移动到下一个字符。这将一直持续到找到零字节,表示字符串的结尾
这基本上是一种节省内存的方法。其他基本数据类型,如int
,足够小,可以便宜地复制它们的值,因此不需要引用对象的地址。在C中引用字符串的方式是通过其第一个字符的地址。读取字符串的函数将读取此地址的字节,并对其进行处理(例如,在printf()
的情况下,将其打印),然后移动到下一个字符。这将一直持续到找到零字节,表示字符串的结尾
这基本上是一种节省内存的方法。其他基本数据类型,如int
,足够小,可以便宜地复制它们的值,因此不需要引用对象的地址。因为当我们编写
char *s="hello";
s
默认采用第一个元素的第一个地址,即“h”的地址
printf中的%s打印整个字符串,而不是元素@first location。
因此,它从不需要遵从操作符。它可能会混淆C编译器是打印第一个元素还是所有元素。因为当我们编写
char *s="hello";
s
默认采用第一个元素的第一个地址,即“h”的地址
printf中的%s打印整个字符串,而不是元素@first location。
因此,它从不需要遵从操作符。它可能会使C编译器混淆是打印第一个元素还是所有元素。原因是编写了printf()
函数来理解传递给它的不同类型的参数。字符串中的格式说明符告诉printf()
每个参数应该是什么。然后,文档会告诉您传递给它的内容
ie。基本上它是有效的,因为printf()
遵循一个定义的规范,而您正遵循它。
因此,在第一个示例中,您使用%d格式printf()
认为这意味着参数应该是整数值。不是指向整数的指针,而是整数。这就是为什么这样做的原因:
void function1(int *ptr) {
printf("%d", *ptr);
}
但这并不是:
void function1(int *ptr) {
printf("%d", ptr);
}
您的第二个示例是一个字符串,这里有一些混淆的可能性,因为C中的字符串不是真正的直接数据类型(即直接数据类型)。它们是指向一个字符的指针,后面跟着其他字符,然后以空\0结尾
void function2(char *str) {
printf("%s", str);
}
现在,如果字符串是C中的数据类型,那么您可能会以与传递其他值相同的方式传递它们(这纯粹是假设):
总而言之:
%d -> int
%s -> char *
之所以这样做,是因为编写了printf()
函数来理解传递给它的不同类型的参数。字符串中的格式说明符告诉printf()
每个参数应该是什么。然后,文档会告诉您传递给它的内容
ie。基本上它是有效的,因为printf()
遵循一个定义的规范,而您正遵循它。
因此,在第一个示例中,您使用%d格式printf()
认为这意味着参数应该是整数值。不是指向整数的指针,而是整数。这就是为什么这样做的原因:
void function1(int *ptr) {
printf("%d", *ptr);
}
但这并不是:
void function1(int *ptr) {
printf("%d", ptr);
}
您的第二个示例是一个字符串,这里有一些混淆的可能性,因为C中的字符串不是真正的直接数据类型