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赋值给指针的地址上的值*/
这边的注释太过复杂。但其实并不会困难。
如果是一个指针,他必须会有指向的类型。
因此我们思考一下这个问题,如果是指针,他指向什么类型。
- *ptr 这个说明ptr是一个指针(地址),那这个地址代表的值是什么类型。
- **ptr 这个就可以回答上面的问题,ptr这个地址代表的值的类型是一个指针(地址)。那这个地址代表的值的类型是什么类型。
- int **ptr 这个就可以说明,地址上的地址所代表的值就是int类型的。
因此ptr是一个指向指针B的指针A,其中指针B指向的变量类型是int类型。
1.png
然后是一个较为复杂的例子
char (*(*x())[])();
- x()为一个函数,那这个函数返回值是什么呢?
- *x(),这个函数的返回值是一个指针,那这个指针指向的类型是什么呢?
- (*x())[]这个指针指向一个数组,那数组的元素类型是什么呢?
- char (*x())[] 数组的类型是char类型,搞定!