指针可以存储值以及void指针的用途是什么?

时间:2014-08-14 17:21:53

标签: c pointers

我知道指针用于存储另一个内存位置的地址。代码如下:

    #include <stdio.h>
    main()
    {
      int a=10;
      void *ptr=10;
      printf("%u",ptr);
    }

我的输出是:10

我们可以像上面的程序一样在指针中存储值吗? void指针的主要用途是什么?

5 个答案:

答案 0 :(得分:0)

void *ptr=10;

这不是有效的C,您需要使用(void *) 10等演员进行显式转换。

printf("%u",ptr);

这不是有效的C,您需要使用(unsigned int) ptr等演员进行显式转换。

关于void指针的使用,它们是通用对象指针,因此您可以将任何对象指针类型的指针值分配给void *

答案 1 :(得分:0)

常量10的类型是int;您正在为int分配void *。这很疯狂,而且错误,绝对无法保证在您打印10的值时获得ptr。你不应该这样做。你不知道如何表示指针值,你不必这样做。你不在乎。

使用void指针非常简单:它只是处理泛型指针的一种方法。例如,您可以实现一个容器&#34;某些东西&#34;通过将void指针存储到正在存储的对象中。请注意,您无法取消引用它 - 您需要先将其强制转换为有效指针。

另外,在旁注中,您应该使用%p来打印指针。

答案 2 :(得分:0)

指针用于存储变量的地址(内存位置)。因此,它们的大小通常是操作系统的字大小(如64位操作系统中的64位= 8字节)。

通过定义指针类型intcharvoid,我们限制指针用于特定数据类型。

  1. 通过为指针void *ptr=10;分配一个常量值,您可能已存储了值,但这不是正确的使用指针,可能会导致以后出现分段错误。始终使用指针存储变量的地址,如void *ptr = &a;

  2. void指针不定义它指向的数据类型。我们可以使用void指针来存储变量的地址,而不知道它的数据类型。

答案 3 :(得分:0)

  

我们可以像上面的程序一样在指针中存储值吗?

应该分配给指针变量的唯一值是:

  • 其他对象的地址(例如int *foo = &x;);
  • 函数地址(int (*fptr)(const char *, ...) = printf;);
  • 明确定义的系统接入点的地址(例如嵌入式系统上的通信端口或中断寄存器);
  • NULL(代表一个明确定义的&#34;无处&#34;)。

您不应该像在示例中那样使用指针变量来存储算术计算或显示的任意值。

声明

void *ptr=10;

提出诊断;您不能直接为没有强制转换的指针变量分配整数值。您可能希望提高您正在使用的编译器的警告级别。

声明

printf("%u",ptr);

调用未定义的行为,因为参数的类型(void *)与转换说明符所期望的不匹配(unsigned int)。它&#34;工作&#34;从某种意义上说它显示了你所期望的价值,但这是运气而不是设计。它可以很容易地打印出垃圾值。

  

void指针的主要用途是什么?

它是一个&#34;泛型&#34;指针类型。指向不同类型的指针不能直接相互指定; IOW,你不能做像

这样的事情
char *foo;
double *bar;

foo = bar; // bzzt

未明确地将bar投射到char *

foo = (char *) bar;

同样,如果你有一个带有一个类型指针参数的函数,你就不能用不同类型的指针调用它:

void f(char *);
...
double x;
f(&x);       // bzzt

此规则的一个例外是void *类型的对象;他们可以在不需要演员的情况下被分配:

int x;
void *foo = &x;

和带有void *类型参数的函数可以接受任何对象指针类型的参数:

void f(void *);
...
double x;
int y;

f(&x);
f(&y);

他们习惯于实施有限形式的&#34;泛型&#34;编程(算法相同,但类型不同)。规范示例是qsort库函数,它可以对任何类型的数组进行排序。

答案 4 :(得分:0)

除非您将其引用到某些内容,否则您无法直接将值存储到指针中。 像x = y这样的指针赋值使y指向与x相同的指针。 您可以参考此信息获取更多信息访问http://cslibrary.stanford.edu/106/