我还没有找到解释为什么要在变量之后放置星号。
这是例子:
int main(){
WSADATA Winsockdata;
WSAStartup(MAKEWORD(2,2), &Winsockdata);
int ListenSocket = socket(AF_INET, SOCK_STREAM,0);
struct sockaddr_in s;
bind(ListenSocket, (SOCKADDR*) &s, sizeof(s));
这是我使用此命令编译后得到的编译器警告:
gcc main.c -l Ws2_32
main.c:50:22: warning: passing argument 2 of 'bind' from incompatible pointer type [-Wincompatible-pointer-types]
50 | bind(ListenSocket, &s, sizeof(s));
| ^~
| |
| struct sockaddr_in *
我认为括号用于将
s
转换为 sockaddr
结构,该结构在 sockaddr_in
之前使用过,以确保兼容性,但我不确定。但为什么 s
里有 & 符号呢?这不是意味着我输入了内存地址吗?我不明白这个。
此外,我研究了变量之前的星号用于将指针转换为值,当我尝试将星号放在
SOCKADDR
之前时,如下所示:
bind(ListenSocket, (*SOCKADDR) &s , sizeof(s));
我收到错误。这意味着在变量之前或之后放置星号肯定是有区别的。这是错误:
错误:“SOCKADDR”之前的预期表达式
SOCKADDR
不是变量名而是类型名。 所以 SOCKADDR *
表示指向该类型的指针。
所以在完整表达的背景下:
(SOCKADDR*) &s
s
是struct sockaddr_in
类型的变量。 一元 &
运算符获取其地址,为您提供一个 struct sockaddr_in *
类型的指针。 然后将该指针 cast 转换为 SOCKADDR *
。
使用
(SOCKADDR*) &s
是正确的。 它确实将 s
的 address转换为指向
SOCKADDR
的指针。 编译器只是警告您,因为就编译器而言,sockaddr_in
和 SOCKADDR
是技术上不相关的类型,但就 API 而言,它们是逻辑上相关的。