指向指针的指针

来源:互联网 发布:java filereader 读取 编辑:程序博客网 时间:2024/06/05 14:43

首先说下指针:

指针是C语言数据类型中一种独立的数据类型:指针类型。作为C语言的精华,当定义一个指针变量时,此变量的作用就是用来存相应数据结构(变量、函数)的地址。

如:

inti;         //定义整型变量

i= 50

int*p;       //定义整型指针变量,p是变量名,int *是类型名

p= &i;      //指针p的值是变量i的地址

注:

1. 程序会在内存某地址空间上为各变量开辟空间,一般而言,int类型占32位,4个字节,这里会为 i,p分别开辟4个字节的空间,比如i的内存首地址为6,p的内存地址首地址为20 ,那么p =&i就意味着指针变量p的值为变量i的首地址6,而*p就是首地址6中存储的的值:50。

此时:p = 6, *p= 50;

2.必须明确的是,指针变量也是变量,定义时,程序也会为它开辟一个空间,本身也是也是有个地址的。

 

指向指针的指针:

int **ppi;    //定义一个指向指针的指针

ppi = &p;    //将指针p的地址存到ppi中

 

注:

1.  这里程序也会为ppi开辟空间,比如首地址为40。 ppi =&p意味着ppi 的值为指针变量p的地址,即20.

2.  此时:ppi = 20, *ppi = 6(地址20中存的数据为6), **ppi = 50(地址6中存的数据为50)

3.  虽然不是很准确,但是理解时可以把指针看做地址,要注意的是,ppi指针的值表示的是它指向的内容p的地址20,而不是ppi本身指针变量的地址40

 

无返回值的情况下,调用函数更改指针变量,就要用到指向指针的指针:

看下面的例子:

#include<iostream>

using namespace std;

 

void func(int *q)

{

    q = (int*)0xFFFFFFFF;

}

int main()

{

    int i= 50;

    int *p =&i;

    func(p);

    cout<<"P= "<<p<<endl;

    return 0;

}

这里输出p中值是i的地址,而不是func()函数中的FFFFFFFF。

而更改如下后:

#include<iostream>

using namespace std;

 

void func(int **q)

{

    *q = (int*)0xFFFFFFFF;

}

int main()

{

    int i= 50;

    int *p =&i;

    func(&p);

    cout<<"P= "<<p<<endl;

    return 0;

}

输出则为:P = FFFFFFFF

 

 总结:

1. 当变量作为函数的参数时,函数内修改的是形参,实参不变化;

2. 想要通过一个无返回值的函数修改主函数中变量的值,那么函数的输入就该是该变量的地址

 

0 0