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中的字符串不是真正的直接数据类型