我必须使用以下签名调用方法:
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),.....);
这会有用吗?但是这种方式我有一个太大的char数组。答案 0 :(得分:5)
这意味着它是一个常量(不可修改的)指针,它可以指向任何东西
不,那将是void *const
。它更像是指向任何东西的指针,其中指针对象(“任何东西”本身)无法修改。
是的,除了缺少的分号外。这会有用吗?
如何创建大小合适的数组?
char hello_str[] = "hello";
甚至
const char hello_str[] = "hello";
答案 1 :(得分:5)
回想一下,const
保护其左侧除非它没有任何内容,否则它会保护其右侧。将此应用于您的代码,我们将const
保护void* buffer
。这意味着它指向的值无法修改:
第一个是指向const变量的指针 - 指针可以改变 第二个是指向变量的 const指针 - 可以更改该值。
这将有效,您可以轻松尝试。
正如其他人已经回答的那样,只需通过以下方式创建正确的尺寸:
char hello_str[] = "hello";
答案 2 :(得分:1)
第一个问题:H2C03是正确的,您应该使类型为void * const
以防止指针被修改。
第二个问题:你有一些选择,具体取决于你在做什么。以下是两个可行的示例:
char hello_str[] = "hello"
socket.sendTo(hello_str, sizeof(hello_str)-1,...);
socket.sendTo(hello_str, strlen(hello_str),...);
在第一次调用sendto时,我们在编译时计算字符串的大小。我们减去1以避免在字符串的末尾发送空终止字符。在第二种情况下,我们通过调用C和C ++中提供的标准strlen
函数在运行时计算它。
答案 3 :(得分: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* const
。 const void*
表示它是无法修改的指针。
您可以阅读this。
答案 4 :(得分:1)
const void* buffer
究竟意味着什么?
这是一个无类型指针(这是另一种说它可以指向任何东西的方式)。它指向的值无法修改(这不完全正确,但至少这是您在看到它时应该考虑的内容)。指针本身可以改变:
const void * buffer = &a;
buffer = &b; // this is valid!
除此之外,您的函数调用完全正确。
答案 5 :(得分:-2)
static const char* hello_str = "hello"
会做到的。用strlen替换sizeof()。也许这应该是一个评论,因为我没有解释指针的基本原理,但我实际上没有看到一点:)这样做,因为在其他地方有很多关于该主题的信息。