1

我必须调用具有以下签名的方法:

int sendTo(const void* buffer, int length, const SocketAddress& address, int flags=0);

  • 我的第一个问题是:

    究竟是const void* buffer什么意思?我的意图是:这意味着它是一个可以指向任何东西的常量(不可修改)指针。这对吗?

  • 第二个问题:

显然,此方法的目的是通过套接字发送数据。第一个参数是数据,第二个是数据的长度。如果我想将字符串“hello”作为第一个参数传递,我该怎么做?

我的想法:

char hello_str[1024] = "hello"
socket.sendTo(hello_str, sizeof(hello_str),.....);

这行得通吗?但是这种方式我有一个太大的字符数组。
如何创建大小合适的数组?

4

5 回答 5

5

回想一下,const保护它的左侧,除非它的左边没有任何东西,然后它保护它的右侧。将此应用于您的代码,我们将得到const保护void* buffer。这意味着它指向的值不能被修改:

在此处输入图像描述

第一个是指向 const 变量的指针 - 可以更改指针。
第二个是指向变量的 const 指针- 可以更改值。

这将起作用,您可以轻松尝试。
正如其他人已经回答的那样,以正确的大小创建它只需通过以下方式完成:

char hello_str[] = "hello";

于 2013-08-08T07:13:50.260 回答
5

这意味着它是一个常量(不可修改)指针,可以指向任何东西

不,那将是void *const。它是一个指向任何东西的指针,不能修改指针(“任何东西”本身)。

这行得通吗?

是的,除了缺少的分号。

如何创建具有正确大小的数组?

char hello_str[] = "hello";

甚至

const char hello_str[] = "hello";
于 2013-08-08T07:00:48.910 回答
1

第一个问题:H2C03是对的,你应该把type设置为be void * const,防止指针被修改。

第二个问题:您在这里有一些选择,具体取决于您在做什么。以下是两个可行的示例:

char hello_str[] = "hello"
socket.sendTo(hello_str, sizeof(hello_str)-1,...);
socket.sendTo(hello_str, strlen(hello_str),...);

在第一次调用 sendto 时,我们在编译时计算字符串的大小。我们减 1 是为了避免在字符串末尾发送空终止字符。在第二种情况下,我们在运行时通过调用strlenC 和 C++ 中可用的标准函数来计算它。

于 2013-08-08T07:00:54.933 回答
1

你可以做 :

const char hello_str[] = "hello"; // Don't forget the const
socket.sendTo(hello_str, sizeof(hello_str)-1,.....);
// or socket.sendTo(hello_str, strlen(hello_str),.....);

要回答您的问题:

const void* buffer 到底是什么意思?我的意图是:这意味着它是一个可以指向任何东西的常量(不可修改)指针。这对吗?

不,那将是void* constconst void*表示不能修改的是pointee。

你可以读到这个

于 2013-08-08T07:01:59.337 回答
1

究竟是const void* buffer什么意思?

它是一个无类型指针(这是可以指向任何东西的另一种说法)。它指向的值不能被修改(这并不完全正确,但至少这是你看到它时应该想到的)。然而,指针本身可以改变:

const void * buffer = &a;
buffer = &b; // this is valid!

除此之外,您的函数调用是完全正确的。

于 2013-08-08T07:04:04.720 回答