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
相关产品推荐
相关产品推荐

