You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows套接字C语言开发:指针使用相关疑问解析

C语言Windows套接字开发中的指针疑问解答

相关代码

int sock;
struct sockaddr_in ServAddr;
unsigned short ServPort;
char *ServIP;
WSADATA wsaData;

ServIP = "192.168.1.6";
ServPort = 50005;

if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) {
    exit(1);
}

sock = socket(AF_INET, SOCK_STREAM, 0);

memset(&ServAddr, 0, sizeof(ServAddr));
ServAddr.sin_family = AF_INET;
ServAddr.sin_addr.s_addr = inet_addr(ServIP);
ServAddr.sin_port = htons(ServPort);

疑问1:为何ServIP是指针类型而ServPort不是?

对应的代码片段:

unsigned short ServPort;
char *ServIP;

ServIP = "192.168.1.6";
ServPort = 50005;

原因很明确:

  • ServIP指向的是字符串:C语言没有原生字符串类型,字符串靠连续字符数组存储,"192.168.1.6"会被放在内存只读区域,char*是指向这个字符数组首地址的指针,且后续调用的inet_addr()函数要求传入char*类型的字符串参数,这是C语言处理字符串的标准方式。
  • ServPort存储的是单一数值:端口号是16位无符号整数,用unsigned short直接存数值本身就足够,既高效又符合htons()这类函数的参数要求。指针是用来指向内存地址的,单一数值直接存在变量里比间接访问更简单高效,完全没必要用指针。

疑问2:以下变量是否为指针类型?

对应的代码片段:

struct sockaddr_in ServAddr;

WSADATA wsaData;

这两个都不是指针类型,它们是实打实的结构体变量:

  • 声明语句直接创建了对应类型的实体,内存直接分配在栈上,变量本身包含结构体的所有成员数据。
  • 代码里的&ServAddr、&wsaData是取变量的地址,得到的才是指针——比如WSAStartup()需要通过指针修改wsaData内部内容,memset()需要清空ServAddr的内存,所以要传它们的地址,但变量本身并非指针。

内容的提问来源于stack exchange,提问作者martia road

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:06:05