将char数组传递给函数

时间:2013-08-08 06:57:40

标签: c++ arrays pointers

我必须使用以下签名调用方法:

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数组。
如何创建具有正确尺寸的阵列?

6 个答案:

答案 0 :(得分:5)

  

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

不,那将是void *const。它更像是指向任何东西的指针,其中指针对象(“任何东西”本身)无法修改。

  

这会有用吗?

是的,除了缺少的分号外。

  

如何创建大小合适的数组?

char hello_str[] = "hello";

甚至

const char hello_str[] = "hello";

答案 1 :(得分:5)

回想一下,const保护其左侧除非它没有任何内容,否则它会保护其右侧。将此应用于您的代码,我们将const保护void* buffer。这意味着它指向的值无法修改:

enter image description here

第一个是指向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* constconst 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()。也许这应该是一个评论,因为我没有解释指针的基本原理,但我实际上没有看到一点:)这样做,因为在其他地方有很多关于该主题的信息。