从一级指针到二级指针
Posted SmartGame
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从一级指针到二级指针相关的知识,希望对你有一定的参考价值。
昨天,写了一些关于一级指针的见解,那么这次我们再来看看二级指针的一些用法,也可以说是我自己的一些见解
所谓二级指针其实和一级指针差不多,一级指针是存储0级指针地址的变量,(一定要记住这一点:指针也是变量,编译器会给它分配内存空间,它的内存空间和它指向的内存空间是不同的,它的内存空间里只能存储空间地址;)所以二级指针就是储存一级指针地址的变量,或者说二级指针是指向一级指针空间的变量;还可以说是指向一级指针的指针;
那么下面我们来看代码:
void changePointer(char **c)
{
*c = 100;//这个改变的是a地址的指向,而不是在其空间上赋值,因为此时还没有为a分配空间,或者说这个空间只能读不能写入,这个空间连void 类型都算不上;我个人是这么理解的
//想要改变a所指向空间的数值的话需要,为其分配内存空间,然后通过指针改变;即是通过 c[x][y] 或者直接操作内存块 *c来改变,但是一定要分配有内存空间
}
void changePointer_2(char *d)
{
d = 200;//在这里改变的是d指向的地址,和a无关
}
void main()
{
char *a = NULL;
char **b = NULL;
b = &a;//如同基本数据类型取地址可赋给一级指针;所以一级指针取地址可以赋给二级指针
//倘若想改变a 指向的地址 可以通过*b来改变
*b = 0x111;//当然也可以直接改变 a = 0xaaa//这里我用的是vs2010 它的地址格式好像就是这样的 也可以直接取数值比如两个函数那样
//然后我们通过函数来改变地址
changePointer(&a);
printf("%d\n",a);//打印出地址为100
//这个时候肯定会有人想用一级指针改变地址,那么我们来实验一下
changePointer_2(a);//因为是一级指针,就像是基本变量之间的数值传递不用取地址;就像是int a; int b; a = b;一样
printf("%d\n",a);//我们发现打印出的地址还是100
//这个地址并没有随着d的变化而变化
system("pause");
}
我们可以发现一级指针取地址可以赋给二级指针,于是二级指针就诞生了;
那么我们来看看这段程序是如何运行的,其实这个昨天0级指针到一级指针的运行差不多:
首先main()函数 a 和 b 都入栈;然后运行到changePointer(&a)时,将地址传递过去,子函数changePointer开辟新的栈空间,二级指针c入栈,这时候c指向的是main函数中a的地址,它操作的就是a变量的空间,所以它可以直接改变指针a 的指向;所以说函数运行完被析构掉之后(c也被析构掉),但是已经通过c改变a 的地址
然后运行到changePointer_2(a),这时将地址传递过去,这时候d入栈,d指向a的空间;这里只是单纯的指向a 的地址,不可以像二级指针那样可以改变a指向的空间;由于他们是不同的变量,所以改变d的指向后,完全不会改变a的指向(就像int a 把数值赋给int b一样,改变b的值不会影响a 的数值),也就是说就算你把 d 的地址指向改变的天翻地覆,也和a没有半毛钱关系;
这个就是我对二级指针的见解;关于如何向一级指针所指的空间中赋值,我会在以后的随笔中发表我的看法;
以上是关于从一级指针到二级指针的主要内容,如果未能解决你的问题,请参考以下文章
C 语言二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )