理解 printf 语句中的指针逻辑
understanding pointer logistics in printf statement
我正在学习 C 中的指针,但我对这个示例有点困惑。下面三个 printf()
语句中指针的指针逻辑是什么?这些是什么:*(char*)ptr
、*(int*)ptr
、(char*)ptr+2
,到底在做什么?
#include<stdio.h>
int main()
{
void *ptr;
char ch=74, *cp="CS107";
int j=65;
ptr=&ch;
printf("%c\n", *(char*)ptr);
ptr=&j;
printf("%c\n", *(int*)ptr);
ptr=cp;
printf("%s\n", (char*)ptr+2);
return 0;
}
(char*)ptr
称为铸造。一种类型的指针 (ptr
) 被转换为指向另一种类型 (char*
) 的变量。
在你的例子中,ptr
是一个void
类型的指针,它在不同的地方被用来指向不同类型的变量。
ptr=&ch;
这使得它指向一个 char
.
类型的变量
然而,指针 ptr
本身只是 void
类型,所以稍后在 printf()
语句中,必须显式转换为 char*
类型才能使它有效。
printf("%c\n", *(char*)ptr);
^^^^^^^
然后,取消引用以访问驻留在该内存中的元素。
printf("%c\n", *(char*)ptr);
^
其他类型同理。
*(char*)ptr
: 把ptr
的值当作一个指向char
数据的指针,然后读取ptr
[指向的char
数据=29=]
*(int*)ptr
: 把ptr
的值当作指向int
数据的指针,然后读取ptr
[指向的int
数据=29=]
(char*)ptr+2
: 把ptr
的值当作一个指向char
数据的指针,然后计算一个指向char
数据的指针,它是2个元素在 ptr
指向的元素之前
我相信您已经得到了答案,但为了澄清 隐藏的 点,让我在现有答案中添加更多信息。
printf("%c\n", *(char*)ptr);
将 void 指针 ptr
转换为 char
指针,然后取消引用以打印 char
值。
printf("%c\n", *(int*)ptr);
将 void 指针 ptr
转换为 int
指针,然后取消引用以打印 int
值的 char
表示。
printf("%s\n", (char*)ptr+2);
在这里,operator precedence 发挥了作用。由于转换运算符将优先于二进制加法,首先 ptr
将转换为 char *
,然后指针运算将生效,将指针递增指向第 3 个 [=12] =] 元素(基于 0 的索引,还记得吗?)。
我正在学习 C 中的指针,但我对这个示例有点困惑。下面三个 printf()
语句中指针的指针逻辑是什么?这些是什么:*(char*)ptr
、*(int*)ptr
、(char*)ptr+2
,到底在做什么?
#include<stdio.h>
int main()
{
void *ptr;
char ch=74, *cp="CS107";
int j=65;
ptr=&ch;
printf("%c\n", *(char*)ptr);
ptr=&j;
printf("%c\n", *(int*)ptr);
ptr=cp;
printf("%s\n", (char*)ptr+2);
return 0;
}
(char*)ptr
称为铸造。一种类型的指针 (ptr
) 被转换为指向另一种类型 (char*
) 的变量。
在你的例子中,ptr
是一个void
类型的指针,它在不同的地方被用来指向不同类型的变量。
ptr=&ch;
这使得它指向一个 char
.
然而,指针 ptr
本身只是 void
类型,所以稍后在 printf()
语句中,必须显式转换为 char*
类型才能使它有效。
printf("%c\n", *(char*)ptr);
^^^^^^^
然后,取消引用以访问驻留在该内存中的元素。
printf("%c\n", *(char*)ptr);
^
其他类型同理。
*(char*)ptr
: 把ptr
的值当作一个指向char
数据的指针,然后读取ptr
[指向的char
数据=29=]*(int*)ptr
: 把ptr
的值当作指向int
数据的指针,然后读取ptr
[指向的int
数据=29=](char*)ptr+2
: 把ptr
的值当作一个指向char
数据的指针,然后计算一个指向char
数据的指针,它是2个元素在ptr
指向的元素之前
我相信您已经得到了答案,但为了澄清 隐藏的 点,让我在现有答案中添加更多信息。
printf("%c\n", *(char*)ptr);
将 void 指针
ptr
转换为char
指针,然后取消引用以打印char
值。printf("%c\n", *(int*)ptr);
将 void 指针
ptr
转换为int
指针,然后取消引用以打印int
值的char
表示。printf("%s\n", (char*)ptr+2);
在这里,operator precedence 发挥了作用。由于转换运算符将优先于二进制加法,首先
ptr
将转换为char *
,然后指针运算将生效,将指针递增指向第 3 个 [=12] =] 元素(基于 0 的索引,还记得吗?)。