【问题标题】:convert int array to pointer in C将int数组转换为C中的指针
【发布时间】:2011-03-15 06:03:38
【问题描述】:
void test()
{
       int buf[1000];

       //populate buf
       foo(buf);//is this correct? Can we pass buf as a pointer that foo expects?



}
void foo(void*ptr)
{}

编辑: 如果 foo 是 fwrite,上述(传递 buf 以便为 fwrite 提供写入某个文件的内容的机制)是否仍然适用?

【问题讨论】:

  • 您的系统上是否安装了 C 编译器?
  • @Vijay:是的,我愿意。为什么要问?
  • 编辑后:在大多数情况下,buf 衰减为指向其第一个元素的指针(buf 衰减为 int* 类型的值)。而void* 的特殊之处在于它可以在指向对象的指针之间来回分配。您可能想阅读C-FAQ 的第 6 部分 ... 以及其他部分 :)
  • 是的,但这就是我想要的,对吧?只是一个 int* 指针。会的,谢谢!

标签: c arrays function pointers


【解决方案1】:

它在 C 中完全有效。foo 参数是一个可以指向任何类型的指针。当你传递一个数组时,它会衰减到一个指向数组第一个元素的指针(即传递第一个元素的地址位置)。所以,

 ptr -> &buf[0] ;

【讨论】:

    【解决方案2】:

    是的,您可以这样做。

    buf 是数组的基指针。

    【讨论】:

      【解决方案3】:

      是的,您将始终将 buf 作为指针传递给函数。

      【讨论】:

        【解决方案4】:

        是的,它是正确的。您可以在 foo 函数中使用“ptr”指针。 http://codepad.org/HwYd0GAh

        【讨论】:

          【解决方案5】:

          正如其他答案指出的那样,是的,您可以将buf 传递给函数。

          但是,在函数内部,变量ptr 的类型为void*。你只能用ptr 本身做一些事情。通常你将它(有或没有演员)转换成相关的东西,比如int*。

          void foo(void *ptr) {
              int *iptr;
              iptr = ptr;
              /* now use iptr */
          }
          

          【讨论】:

          • 既然 buf 是 int 类型,ptr 会不会指向一个 int 数组并因此表现得像一个 int 指针?
          • @Namratha:就foo函数而言,buf不存在。 ptr 是 void* 类型,这意味着它可以“安全地”转换为任何其他指针类型(编译器假定程序员知道他/她在做什么)。
          • 请检查已编辑的问题。在那种情况下也是如此吗?
          • @Namratha:在那种情况下(很可能是任何情况下),foo 需要知道ptr 指向的数据的大小。 foo() 应该需要数据作为附加参数,并被称为:foo(buf, sizeof(buf))。或者使用 2 个额外的参数,元素大小和元素计数,就像 fwrite() 所做的那样:foo(buf, sizeof(int), 1000)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-08
          • 1970-01-01
          • 1970-01-01
          • 2017-02-12
          • 2021-04-12
          相关资源
          最近更新 更多