昨天,写了一些关于一级指针的看法,那么此次咱们再来看看二级指针的一些用法,也能够说是我本身的一些看法
所谓二级指针其实和一级指针差很少,一级指针是存储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");void
}
咱们能够发现一级指针取地址能够赋给二级指针,因而二级指针就诞生了;
那么咱们来看看这段程序是如何运行的,其实这个昨天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没有半毛钱关系;
这个就是我对二级指针的看法;关于如何向一级指针所指的空间中赋值,我会在之后的随笔中发表个人见解;