我爱编程

C语言指针的复杂声明

2018-05-28  本文已影响0人  王伯卿

前记:最近因为离职有很多很多事情,有些郁闷,导致一直没有更新和学习。

这篇看了好多文章,所以搁浅了很久很久。
现在终于明白了,终于可以来记录自己的学习成果了。
让我们先写一个简单的例子

  int i = 5;  /*声明一个变量*/
  int * ptr;  /*声明一个指针*/
  ptr = &i;  /*将变量i的地址赋值给指针变量*/
  *ptr = 2;  /*通过指针定位到某一个地址的值,将2赋值给它*/

这里的雪花号*,有两个作用,一是用在声明语句中,表示声明的是指针。另外是在赋值中,表示取指针的内容。

这里在说说 & 和 * 的区别。&表示取地址,和*表示取值,是完全不一样的。

然后让我们写一个稍复杂的例子。

  int num = 1; /*声明一个变量*/
  int *ptr_1 = #  /*声明一个指针(地址),将num的地址赋值给ptr_1*/
  int **ptr_2; /*声明一个指针的指针(地址的地址)*/
  ptr_2 = &ptr_1; /*将该指针(地址)的地址赋值给指向地址的指针*/
  **ptr_2 = 2; /*将2赋值给指针的地址上的值*/

这边的注释太过复杂。但其实并不会困难。

如果是一个指针,他必须会有指向的类型。
因此我们思考一下这个问题,如果是指针,他指向什么类型。

  1. *ptr 这个说明ptr是一个指针(地址),那这个地址代表的值是什么类型。
  2. **ptr 这个就可以回答上面的问题,ptr这个地址代表的值的类型是一个指针(地址)。那这个地址代表的值的类型是什么类型。
  3. int **ptr 这个就可以说明,地址上的地址所代表的值就是int类型的。

因此ptr是一个指向指针B的指针A,其中指针B指向的变量类型是int类型。


1.png

然后是一个较为复杂的例子

char (*(*x())[])();
  1. x()为一个函数,那这个函数返回值是什么呢?
  2. *x(),这个函数的返回值是一个指针,那这个指针指向的类型是什么呢?
  3. (*x())[]这个指针指向一个数组,那数组的元素类型是什么呢?
  4. char (*x())[] 数组的类型是char类型,搞定!
上一篇下一篇

猜你喜欢

热点阅读