二级指针**P

首先理解几个概念:

1.对于一个普通变量,进行引用操作,得到的是一级指针。如int a=0;int *p=&a,则&a就是一级指针。因为&a的值就是a的地址,p的值也是a的地址,则&a和p就是一级指针变量(简略为指针),对&a进行解引用操作,int b=*&a;这b等于0.

2.对于普通变量作为形参传递到函数内部,参数的值传递就意味着只是简单的将变量的值copy了一份到临时变量中,然后将临时变量传递给函数,然而临时变量和原始变量是没有任何关系,则函数是无法改变外部原始变量的值

3.对于一级指针变量作为形参传递到函数内部,虽然这个一级指针的值(就是指向对象的地址)会copy一份到临时变量,但是这个临时变量的内容是一个地址,通过->解引用一个地址可以修改该地址所指向的内存单元的值。总结:一级指针作为参数传递,可以改变外部变量的值,即一级指针所指向的内容,但是却无法改变指针本身。

对于二级指针:

1.对于一个二级指针进行解引用得到一级指针,对于一个一级指针解引用得到原始变量,int
**p,*p就是一个指针,**p就是原始变量的值。

2.一级指针和二级指针的值都是指向一个内存单元,一级指针指向的内存单元存放的是源变量的值,二级指针指向的内存单元存放的是一级指针的地址

        int a =1;
	int *b =&a;
	int **c=&b;
	cout<<&a<<endl;
	cout<<b<<endl;
        cout<<*c<<endl;
        /*以上输出都是a的地址,而下面两行就是b的地址*/
	cout<<&b<<endl;
	cout<<c<<endl;

3.二级指针一般用在需要修改函数外部指针的情况。因为函数外部的指针变量,只有通过二级指针解引用得到外部指针变量在内存单元的地址,修改这个地址所指向的内容即可。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void increase(int** ptr)
 {
      **ptr = **ptr + 1;/*对于一个二级指针进行解引用得到一级指针,对于一个一级指针解引用得到原始变量*/
      *ptr = NULL;
  }

 int main(int argc, char** argv)
 {
    int count = 7;
    int* countPtr = &count;
    increase(&countPtr);/*当二级指针(&countPtr)传进来时,这个二级指针的值(就是一级指针变量的地址)会copy一份到临时变量传给函数形参,然而对这个临时变量操作就会影响一级指针变量countptr,从而影响到二级指针所指向的原变量*/
    printf("countPtr = %p\n", countPtr);
    return 0;
}
/*这段代码,运行结果count = 8, countPtr = NULL;*/
或者是
void GetMemory( char **p, int num )
{
    *p = (char *) malloc( num );
}

void Test( void )
{
    char *str = NULL;
    GetMemory( &str, 100 );
    strcpy( str, "hello" );
    printf( str );
}

4.对于C语言的参数传递都是值传递,当传传递一个指针给函数的时,其实质上还是值传递,除非使用双指针.

总结

首先,指针变量,它也是一个变量,在内存单元中也要占用内存空间。一级指针变量指向的内容是普通变量的值,二级指针变量指向的内容是一级指针变量的地址。

此文参考于:http://www.fenesky.com/blog/2014/07/03/pointers-to-pointers.html

时间: 2024-11-02 18:18:14

二级指针**P的相关文章

黑马程序员---C基础9【字符串的输入输出】【字符串相关函数】【指针】【指针变量初始】【二级指针】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [字符串的输入输出] 1.字符串输出: %s-------从给定的地址开始输出字符直到遇到\0停止: printf("%s\n",&a[3]);  printf("%s\n",a); char a[]="hellowo\0rd!"; 2.字符串输入: 从键盘上接收一个字符串,保存在以a为首地址的字符数组中 scanf("%s&

二级指针的三种内存模型

第一种内存模型: /* Module: 二级指针第一种内存模型.cpp Notices: Copyright (c) 2017 Landy Tan */ #include <iostream> using namespace std; ///////////////////////////////////////////////// #define SIZE(a) sizeof(a) / sizeof(a[0]) int SortArray(char **pArray, int nLen);

思维启示之意外的收获(发现自己思维局限和掀开二级指针的虎皮)

潘鹏在CSDN上原创.如其它站点转载请注意排版和写明出处: 今天仍旧是最后一个离开,本来是封装的线程扩展功能来卖票的.但我想将统计是否有漏票的程序封装进去,可是一直纠结的我多个线程就有多个对象,我必需要等全部的线程执行结束才干来统计,可是我不能在接口类和线程类里来写,那我仅仅能写在对用户开放的类里,那这种话,我多个类对象谁去调???调之前我多个对象难道在main里写多次等待线程执行结束??? 由于想要解决第一个问题,我想法去封装线程的类里去接受线程回调函数里面调用的虚函数的返回值,仅仅要有返回值

二级指针与二维数组

最近看<Linux C程序设计大全>这本书,虽然书中有一些错误,但整体来说,书写得还算可以. 当看到网络编程[第23.2.4小节 获得主机信息]时,遇到了一段代码,原文如下: “一台主机有许多和网络相关的信息,例如,主机名称.IP地址.主机提供的服务等.这些信息一般都保存在系统中的某个文件里(例如/etc/hosts等),用户程序可以通过系统提供的函数读取这些文件上的内容.Linux环境下使用gethostent函数读取和主机有关的信息,该函数的原型如下: 1 #include <net

【C/C++学院】0726-cppIDE/一级指针/指针数组/函数指针/函数指针数组/二级指针

[送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步. 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现. 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我. cppIDE 使用mfc和codeblocks中的mingw编译器.执行system命令中的bat批处理脚本. 一级指针 指针,结构体struct,

二级指针的作用及用途?.xml

pre{ line-height:1; color:#9f1d66; background-color:#e1e1e1; font-size:16px;}.sysFunc{color:#5d57ff;font-style:italic;font-weight:bold;} .selfFuc{color:#8e0ed3;} .bool{color:#008000;} .condition{color:#008000;font-weight:bold;} .key{color:#440080;} .

int?(*p)[4]?p?是二级指针?二维数组?二级指针?.xml

pre{ line-height:1; color:#2f88e4; background-color:#e9ffff; font-size:16px;}.sysFunc{color:#3d7477;font-style:italic;font-weight:bold;} .selfFuc{color:#a0b684;} .bool{color:#86ddd8;} .condition{color:#94e269;font-weight:bold;} .key{color:#ae0bfd;} .

c++中的悬浮指针和野指针 二级指针

(1) c++中的悬浮指针:声明了但没有被付值的指针,它指向内存中的任意一个空间.避免悬浮指针的一个方法是开始就付值为NULL (2)"野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用.野指针的成因主要有两种: 一.指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同

二级指针

目标:分配一段内存,内存用于存储指针. 代码: #include <stdio.h> #include <stdlib.h> void test(char **p, char *str, char *str2) { printf("p:%p\n", p); /* p指向malloc分配的内存起始地址 x */ printf("&p:%p\n", &p); /* &p为入参p自己本身的地址 x2 */ printf(&q