您的位置:首页 > 其它

关于指针的浅析---------多级指针,常量指针,指针常量,指向指针常量的常量指针

2016-12-24 23:47 405 查看

关于指针的浅析———多级指针,常量指针,指针常量

在指针中可能有几个比较难的地方,比如说多级指针,指针的指针,常量指针,指针常量,多级是多少级,什么是多级,怎么去理解多级,常量指针和指针常量我们到底怎么去区分,什么情况下需要用常量指针或者指针常量等等,大半夜看到这个,其实我也是有点蒙蔽感。


多级指针

常量指针

指针常量

指向指针常量的常量指针

多级指针

参考下图:



从图片中我们可以看到一个变量num,和两个指针pointer1和pointer2,

指针变量pointer1中存储的是num的地址,而指针pointer2中存储的地址为pointer1的地址,举个最好最简单的例子,就种指向关系就像是你有个抽屉和一把钥匙,而一级指针就像我们直接通过这个钥匙去开锁,但是现在改变了,我把要是放到 另外一个抽屉2里面去了,现在你要先去抽屉2中拿到钥匙,才能开锁吧。这个大概就类似于2级指针的操作,而更多级指针也是一样,好比三级指针,抽屉2也上锁了,然后抽屉2的要是放在抽屉3中,我们只有从抽屉3中拿到钥匙才能开锁吧。当然这个比喻也有不恰当的地方。但是他们的指向关系大概就是这样的中关系。

我既可以通过pointer1去拿到num的数值,也可以通过pointer2先去拿到pointer1中的值,在通过pointer1去拿到num的值,只不过可能经过的步骤增多了

下面我们来说一下多级指针的概念:

多级指针叫做指针的指针,它指向的是另外一个指针变量。我们在应用的过程中,往往用二级指针相对比较多一点,当然。如果你能够理解指针的原理之后,不管多少级的指针,对于我们来说也都是小Case啦

如:

int num =10;

int *pointer_1 = #

int *pointer_2 = &pointer1;//注意二级指针变量存储的是一级指针变量的地址;

指针常量和常量指针,指向指针常量的常量指针

这两个概念只是前后词语进行了调换,但是他们所表达 的意思,以及实际的应用场景却是前差萬別的。在应用的过程中,一定要注意区分。

首先我们来了解下C语言中的常量:即不允许被修改的量。用const关键字来进行修饰的量

如const int num = 10;

如果对常量值进行修改的话,如num = 20;编译器会直接编译不过

而指针的概念在前面几篇中我们也提到。

常量 + 指针 会发生什么样的化学反应呢,第一是不允许修改。第二是指向性的差异。

主要分为:

1:指针本身是不能进行修改的,即指针变量中存储的地址不允许修改。

2:指针是允许进行修改的,但是指针所指向的内存空间中的值是不允许进行修改的。

下面我们先说一下指针常量和常量指针的概念吧:

1:常量指针:

通过该常量指针不可以修改它所指向的内存存储单元的值

但是它的指针的地址是可以进行修改的

如: int const * pointer;

2:指针常量:

指针指向是不允许进行修改的,但是指向的值不允许被修改(Pointer中存储的地址不允许被修改)

如:int * const pointer;

3:指向指针常量的常量指针

指针不允许被修改,指针的指向的存储单元也是不允许被修改的

如:int const * const pointer;

如下图所示:



规律:const 与 *   谁在前面,谁就不允许改变,
int const * pointer1------>常量不可变,指针可变,指向的存储单元是只读的,无论怎么去修改它的指向
int * const pointer2 ------->指针不可变,但是常量可变


下面通过代码给大家演示下其区别:

#include<stdio.h>
#include<stdlib.h>

void out_salary(float const *salary);

int main(int argc,char *argv[]){
int num1  = 10;
int num2  = 20;
/**
*常量指针指向的那块区域是只读的,不能修改,但是指针的本身是可以进行修改的;
*常量指针我们一般当作函数的形参使用,目的就是在函数中不允许通过常量指针去修改它指向的存储单元中的数值,而必须在函数中需要用另外的指针       *去赋值,这样才能够对存储单元进行操作
*/
int const *pointer = &num1;
//修改常量指针的指向。
pointer = &num2;
//常量指针的指向是只读的,所以下面这行代码其实是非法的,
//*pointer = 5;
printf("num2:%d,*pointer:%d\n",num2,*pointer);
int *pointer2 = &num2;
*pointer2 = 5;
printf("num2:%d,*pointer2:%d\n",num2,*pointer2);

float salary = 11000;
out_salary(&salary);

/*
*  指针常量
*  但是可以通过二级指针的形式来改变指针常量的指向
*/
int num3 = 30;
int num4 = 40;
int * const pointer_3 = &num3;
*pointer_3 = num4;
//指针常量的指向是不能变化的,指向的存储单元中的值是允许变化的,因此下面一行的使用是错误的
//pointer_3 = &num4;
printf("num3:%d,pointer_3:%d\n",num3,*pointer_3);
int num5 = 6;
int **p_pointer = &pointer_3;
*p_pointer  = &num5;
printf("*pointer_3:%d,*p_pointer:%d\n",*pointer_3,**p_pointer);

/*
*指向常量的指针常量
*
*/
int num6 = 15;
int num7 = 80;
int const * const pointer_4 = &num6;
//因为其指针不允许被修改,指针的指向也是不允许被修改的,所以下面代码是错误的
//pointer_4  = &num7;
//*pointer_4 = num7;
return 0;
}

void out_salary(float const * salary){
printf("salary:%f\n",*salary);
}


输出结果如下所示:

num2:20,*pointer:20

num2:5,*pointer2:5

salary:11000.000000

num3:40,pointer_3:40

*pointer_3:6,*p_pointer:6

小弟初学,有什么错误的地方请大家及时指出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针