2017-05-01 25 views
0

我正在使用C++中的pcap库到sniff网络流量。 在pcappcap_if_tstruct如下:在C++中将pcap_if_t *转换为pcap_if_t **

struct pcap_if { 
    struct pcap_if *next; 
    char *name;  /* name to hand to "pcap_open_live()" */ 
    char *description; /* textual description of interface, or NULL */ 
    struct pcap_addr *addresses; 
    bpf_u_int32 flags; /* PCAP_IF_ interface flags */ 
}; 
typedef struct pcap_if pcap_if_t; 

现在,我感到困惑在int pcap_findalldevs(pcap_if_t **, char *);原型使用&alldevs值作为在波纹管代码中的第一个值。而pcap_if_t *alldevs是一个指针,与pcap_if_t **参数(它是指向另一个指针的指针)不匹配。

pcap_if_t *alldevs; 
char errbuf[PCAP_ERRBUF_SIZE]; 

/* Retrieve the device list from the local machine */ 
if (pcap_findalldevs(&alldevs, errbuf) == -1) 
{ 
    fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf); 
    exit(1); 
} 

例如甚至,i相int **arr语句来测试“指针指针”(指针的链)。我定义int **arr作为matrix

int **arr = new int*[5]; 
for(int i = 0; i < 5; i++) 
{ 
    arr[i] = new int[3]; 
} 

然后定义void print_arr(int **arr, int r, int c)功能,由于打印matrix值,并给它的两个不同参数(arr&arr2):

int *arr2 = static_cast<int*>(*arr); 

print_arr(arr, 5, 3);    // arr defined in top 
print_arr(&arr2, 5, 4);   // arr2 is a pointer as *arr2 

不管提供示例的,c++如何与此转换行为?它有一些含糊不清的意识。

+2

'&'得到的*地址*什么东西(指向它)...这应该包括在任何初学者级别的C++书籍或教程... – Dmitri

回答

1

在此背景下的&运算符是运算符address of。当你获取一个变量的地址时,你会得到一个指向该变量的指针。指针存储地址。

例如为:

int a = 1; 
int *b = &a; 

b现在指向您的a变量。由于a有型int&a给你一个类型的指针为int,一个int*

同样的事情发生,如果你做一个更多的时间:

int a = 1; 
int *b = &a; 
int **c = &b; 

现在cb。由于b有型int *&b给你的类型的指针为int的指针,一个int **

同样的事情发生在你的函数调用

if (pcap_findalldevs(&alldevs, errbuf) == -1) 

你拿alldevs变量的地址。由于alldevs的类型为pcap_if_t*,因此&alldevs的类型为pcap_if_t**

你可以像这样做太:

pcap_if_t *alldevs; 
    pcap_if_t **alldevs_ptr = &alldevs; 

if (pcap_findalldevs(alldevs_ptr, errbuf) == -1) 
+0

我知道所有这些,我知道'&'得到一个变量的地址,但我困惑关于'int ** c =&b;'。因为我认为'&'只是''变量''像'int a = 1; int * b =&a;'而不是'指针'。但如果使用'int ** c = b;'而不是'int ** c =&b;'会怎么样? –

+0

我知道'&'是用于获取左侧的'variable'的地址。但'pointer'左边的'&'是什么意思? –

+0

@MohammadrezaPanahi正如我在这里的答案中所显示的,当&在指针的左侧时没有区别。指针可以是一个变量。一个变量可以是一个指针。你把一个变量的地址作为一个指针,然后你得到一个指向那个指针的指针 - 哪个人调用一个指向一个指针或一个双指针的指针。如果你使用'int ** c = b;',那么'b'的类型是一个'int *',而'c'的类型是一个'int **',即使你编译的时候不允许赋值一个'int *'到一个'int **',它们的类型是不兼容的。 – nos

0

我想提供与此代码一个很好的例子:

int f = 48; 
int *g = &f; 
int **h = &g; 
int ***i = &h; 
int ****j = &i; 

cout << j << endl; 
cout << &i << endl; 

这里,j是一个链指针包含i地址,所以输出将如下所示:

0x7ffe373a6220 
0x7ffe373a6220 

两个结果显示为j值(其中地址pointed)和i的内存地址,其中两个是相同的,因为j包含&i。并且还h&g为:

cout << h << endl; 
cout << &g << endl; 

此外,所示的输出h值(即指向g地址)和&g,其在这里是相同的:

0x7ffe373a6210 
0x7ffe373a6210