对于那些了解网络编程的人,请到最后,有问题自己。对于其他人,我将在下面解释更多。
(虽然我的问题不是关于网络编程的,但我会使用这个主题的一个例子,以免提出问题时出错)
有一个函数返回指向结构的指针:
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list; // массив, содержащий адреса всех сетевых интерфейсов
};
struct hostent *gethostbyname(const char *host_name);
此外,还有一个我们稍后会用到的结构。
struct in_addr {
unsigned long s_addr;
};
以及我们也需要的功能
char *inet_ntoa(struct in_addr in) // конвертирует целочисленный тип в айпи-адрес стандартного вида (с точкой)
因此,我们的目标是找出主机的 ip,为此我们执行以下操作:
int main(void){
struct hostent *test; // указатель на структуру hostent
struct in_addr **making; // ?
int i = 0;
char buffer[17]; /* буфер для хранения айпи-адреса в стандартном виде */
test = gethostbyname("www.google.com"); /* теперь test - структура типа hostent */
making = (struct in_addr **) test->h_addr_list; // ?
for(i = 0; making[i] != NULL; i++){ // ?
strcpy( buffer, inet_ntoa(*making[i])); // ?
}
puts(buffer); // выводим наш айпи адрес в стандартном виде с точкой
return 0;
}
其实我的问题:
1) 如何正确阅读下面的条目?
struct in_addr **making;
指向结构的指针?
2)这里发生了什么?我们是否正在初始化指向指针的指针?然后怎样呢?
making = (struct in_addr **) test->h_addr_list;
3)making[i]它是结构还是指针?还是指向结构的指针?
4) 函数接受的参数是inet_ntoa()一个 struct 类型in_addr。但是我还是不太明白记录- *making[i]。她喜欢什么?
5) 为什么我们需要使用这个循环
for(i = 0; making[i] != NULL; i++){
strcpy( buffer, inet_ntoa(*making[i]));
}
不能这样写
strcpy( buffer, inet_ntoa(*making[0]));
因为我们仍然只取第一个地址
提前感谢那些回答或至少阅读的人
1)是的,它是一个指向指针的指针。它们用于将指针传递给某处的数组,以便可以对其进行修改(数组也是指针)。
2)类型铸造。在网络编程中,这是一个典型的技巧。我们初始化一个指向具有某个地址的指针的指针。
3) make 是一个指向结构的指针。
making[i]是指向结构的指针。*making也是指向结构的指针。**making并且*making[i]是结构4) si 中有一个简单的规则(还有加号)
a[b] == b[a] == *(a+b)(也就是说,这 3 个条目的含义相同,它们可以互换。以及1["Hello"] - валидная и это просто букваe` 结构)。方括号“吃一个星号”。中存储的不是一个值
test->h_addr_list,而是一个以 NULL 元素结尾的数组(以免拖拽大小,这也是网络编程中的一个典型技巧)。通过构造,*making[i]我们只需从数组中提取 i 元素并取消引用它(获得一个值,而不是指针)5)循环用于遍历所有记录并获得正确的记录(在本例中为最后一条)。你错误地认为只有第一个会在那里。
但我认为这段代码中删除了循环体的一部分,并且有一个输出到控制台或检查一个条件(毕竟,可能有不同的地址,需要一点过滤)。
一般来说,所描述的问题与网络编程有相对关系。在使用指向指针的指针时存在误解。