C语言指针5分钟教程.docVIP

  • 1
  • 0
  • 约3.37千字
  • 约 4页
  • 2017-08-26 发布于河南
  • 举报
指针、引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量。在这份教程里“引用”表示计算机内存地址。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可以是void类型、NULL指针和未初始化指针。本文会对上述所有指针类型进行探讨。 根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值。当用在声明一个变量时,*表示这里声明了一个指针。其它情况用到*表示指针的取值。 是地址操作符,用来引用一个内存地址。通过在变量名字前使用操作符,我们可以得到该变量的内存地址。 // 声明一个int指针 int *ptr; // 声明一个int值 int val = 1; // 为指针分配一个int值的引用 ptr = val; // 对指针进行取值,打印存储在指针地址中的内容 int deref = *ptr; printf(%d\n, deref); 第2行,我们通过*操作符声明了一个int指针。接着我们声明了一个int变量并赋值为1。然后我们用int变量的地址初始化我们的int指针。接下来对int指针取值,用变量的内存地址初始化int指针。最终,我们打印输出变量值,内容为1。 第6行的val是一个引用。在val变量声明并初始化内存之后,通过在变量名之前使用地址操作符我们可以直接引用变量的内存地址。 第8行,我们再一次使用*操作符来对该指针取值,可直接获得指针指向的内存地址中的数据。由于指针声明的类型是int,所以取到的值是指针指向的内存地址存储的int值。 这里可以把指针、引用和值的关系类比为信封、邮箱地址和房子。一个指针就好像是一个信封,我们可以在上面填写邮寄地址。一个引用(地址)就像是一个邮件地址,它是实际的地址。取值就像是地址对应的房子。我们可以把信封上的地址擦掉,写上另外一个我们想要的地址,但这个行为对房子没有任何影响。 void指针、NULL指针和未初始化指针 一个指针可以被声明为void类型,比如void *x。一个指针可以被赋值为NULL。一个指针变量声明之后但没有被赋值,叫做未初始化指针。 int *uninit; // int指针未初始化 int *nullptr = NULL; // 初始化为NULL void *vptr; // void指针未初始化 int val = 1; int *iptr; int *castptr; ? // void类型可以存储任意类型的指针或引用 iptr = val; vptr = iptr; printf(iptr=%p, vptr=%p\n, iptr, vptr); ? // 通过显示转换,我们可以把一个void指针转成 // int指针并进行取值 castptr = (int *)vptr; printf(*castptr=%d\n, *castptr); ? // 打印null和未初始化指针 printf(uninit=%p, nullptr=%p\n, uninit, nullptr); // 不知道你会得到怎样的返回值,会是随机的垃圾地址吗? // printf(*nullptr=%d\n, nullptr); // 这里会产生一个段错误 // printf(*nullptr=%d\n, nullptr); 执行上面的代码,你会得到类似下面对应不同内存地址的输出。 iptr=0x7fff94b89c6c, vptr=0x7fff94b89c6c *castptr=1 uninit=0x7fff94b89d50, nullptr=(nil) 第1行我们声明了一个未初始化int指针。所有的指针在赋值为NULL、一个引用(地址)或者另一个指针之前都是未被初始化的。第2行我们声明了一个NULL指针。第3行声明了一个void指针。第4行到第6行声明了一个int值和几个int指针。 第9行到11行,我们为int指针赋值为一个引用并把int指针赋值为void指针。void指针可以保存各种其它指针类型。大多数时候它们被用来存储数据结构。可以注意到,第11行我们打印了int和void指针的地址。它们现在指向了同样的内存地址。所有的指针都存储了内存地址。它们的类型只在取值时起作用。 第15到16行,我们把void指针转换为int指针castptr。请注意这里需要显示转换。虽然C语言并不要求显示地转换,但这样会增加代码的可读性。接着我们对castptr指针取值,值为1。 第19行非常有意思,在这里打印未初始化指针和NULL指针。值得注意的是,未初始化指针是有内存地址的,而且是一个垃圾地址。不知道这个内存地址指向的值是什么。这就是为什么不要对未初始化指针取值的原

文档评论(0)

1亿VIP精品文档

相关文档