在 C++ 中将 pcap_if_t* 转换为 pcap_if_t**
casting pcap_if_t* to pcap_if_t** in c++
我正在使用 pcap
库处理 sniff
C++ 中的网络流量。
在 pcap
库中,pcap_if_t
是一个 struct
,如下所示:
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);
}
例如,我甚至用 int **arr
语句测试 "pointer to pointer"(指针链)。我将 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++
此转换的表现如何?有点模棱两可。
此上下文中的 &
运算符是 address of
运算符。当您获取变量的地址时,您将获得指向该变量的指针。指针存储地址。
例如:
int a = 1;
int *b = &a;
b
现在指向您的 a
变量。因为 a
的类型是 int
,&a
给你一个指向 int 的指针类型,一个 int*
如果你再做一次同样的事情会发生:
int a = 1;
int *b = &a;
int **c = &b;
现在 c
指向 b
。由于 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)
我想用这段代码提供一个很好的例子:
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
我正在使用 pcap
库处理 sniff
C++ 中的网络流量。
在 pcap
库中,pcap_if_t
是一个 struct
,如下所示:
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);
}
例如,我甚至用 int **arr
语句测试 "pointer to pointer"(指针链)。我将 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++
此转换的表现如何?有点模棱两可。
此上下文中的 &
运算符是 address of
运算符。当您获取变量的地址时,您将获得指向该变量的指针。指针存储地址。
例如:
int a = 1;
int *b = &a;
b
现在指向您的 a
变量。因为 a
的类型是 int
,&a
给你一个指向 int 的指针类型,一个 int*
如果你再做一次同样的事情会发生:
int a = 1;
int *b = &a;
int **c = &b;
现在 c
指向 b
。由于 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)
我想用这段代码提供一个很好的例子:
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