二级指针_二级指针传参 - CSDN
二级指针 订阅
A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量.根据B的不同情况,二级指针又分为指向指针变量的指针和指向数组的指针。 展开全文
A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量.根据B的不同情况,二级指针又分为指向指针变量的指针和指向数组的指针。
信息
作    用
为了获取指针的存放地址。
分    类
按指向的数据类型分类
指    针
表现形式是地址
中文名
二级指针
二级指针介绍
首先任何值都有地址 ,一级指针的值虽然是地址,但这个地址做为一个值亦需要空间来存放,是空间就具有地址 ,这就是存放地址这一值的空间所具有的地址,二级指针就是为了获取这个地址。一级指针所关联的是其值(一个地址)名下空间里的数据,这个数据可以是任意类型并做任意用途,但二级指针所关联的数据只有一个类型一个用途,就是地址,指针就是两个用途提供目标的读取或改写, 那么二级指针就是为了提供对于内存地址的读取或改写。指针的表现形式是地址,核心是指向关系指针,运算符“*”的作用是按照指向关系访问所指向的对象.如果存在A指向B的指向关系,则A是B的地址,“*A”表示通过这个指向关系间接访问B.如果B的值也是一个指针,它指向C,则B是C的地址,“*B”表示间接访问C,如果C是整型、实型或者结构体等类型的变量或者是存放这些类型的数据的数组元素,则B(即C的地址)是普通的指针,称为一级指针,用于存放一级指针的变量称为一级指针变量,指向一级指针变量的"A"则是“二级指针”。
收起全文
精华内容
参与话题
  • 在前面的文章《如何理解C指针及二级指针(1)》 介绍了指针的一些重要概念,对于一级指针,相对来讲是比较容易理解的,这里就不再赘述了。我们重点来看一下二级指针的使用方式。 我们知道,不管是几级 指针,本质...

        在前面的文章《如何理解C指针及二级指针(1)》 介绍了指针的一些重要概念,对于一级指针,相对来讲是比较容易理解的,这里就不再赘述了。我们重点来看一下二级指针的使用方式。

        我们知道,不管是几级 指针,本质上也是个普通变量,只不过指向的内容不同而已。二级指针指向的是“一级指针的地址”。

    这里,参考博友二级指针的详解的里的图片,向作者致谢。

    使用方法一:

       先为二级指针分配空间,然后赋值,解引用采用*。   

        代码段:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]) {
    	int **ptr = NULL;
    	int num = 4, size = 4;
    	int i,j;
    	
    	ptr = (int **)malloc(num * sizeof(int *));
    	for(i = 0; i < num; i++){
    		*(ptr + i) = (int *)malloc(size * sizeof(int));
    		for(j = 0; j < size; j++)
    			*(*(ptr + i) + j) = (i + 1)*j;
    	}
    	
    	for(i = 0; i < num; i++){
    		for(j = 0; j < size; j++){
    			printf("(%d, %d) -> %d\t", i, j, *(*(ptr +i) + j));
    		}
    		printf("\n");
    	} 
    	
    	return 0;
    }

     程序执行结果:

    进一步,通过指针指向图来说明,如下图所示:

     

    使用方法二:

        先为二级指针分配空间,然后赋值,解引用采用数组方式。

    程序代码:

    ptr = (int **)malloc(num * sizeof(int *));
    	for(i = 0; i < num; i++){
    		ptr[i] = (int *)malloc(size * sizeof(int));
    		
    		for(j = 0; j < size; j++)
    			ptr[i][j] = (i + 1)*j;
    	}
    	
    	for(i = 0; i < num; i++){
    		for(j = 0; j < size; j++){
    			printf("[%d, %d] -> %d\t", i, j, ptr[i][j]);
    		}
    		printf("\n");
    	} 

     运行结果:

    在内存中,指针指向图:

    小结:

        我们在使用二级指针时,牢记,二级指针也只是一个普通变量,只不过这个二级指针变量要指向的是一个 指针的地址,理解的时候,一定要先入为主这个概念,这是最根本的定义。

        我们在对指针进行间接引用时,可以使用“*”操作符,也可以使用数组“[ ]”,这说明“*”和“[ ]”的效果是相同的,根据自己的习惯使用就好,我更喜欢使用“[ ]”。

    展开全文
  • 深入理解指针以及二级指针(指针的指针)

    千次阅读 多人点赞 2020-04-30 18:40:29
    前言:本文将讲解指针的定义、指针变量和普通变量的本质区别、一级指针和二级指针的关系以及如何通过二级指针修改一级指针所指向的内存。文末还附加了两个实例,帮助读者加深对二级指针的理解。本文试图通过图表的...

    前言:本文将讲解指针的定义、指针变量和普通变量的本质区别、一级指针和二级指针的关系以及如何通过二级指针修改一级指针所指向的内存。文末还附加了两个实例,帮助读者加深对二级指针的理解。本文试图通过图表的方式,通俗地讲解指针和二级指针,让读者对此有深入的理解。阅读本文大概需要15分钟的时间。

    1、指针的定义:

    int a = 1; //普通变量的定义
    int *pA = &a; //指针的定义
    
    或者
    int *pA = NULL;
    pA = &a;
    

    符号&表示“取址符”,也就是获取上面的变量a所在内存空间的地址。
    从上面指针的第二种定义中就可以看出,变量pA的值等于变量a的内存地址。星号*的作用是表明变量pA是一个指针变量。那么,普通变量和指针变量的区别是什么呢?

    2、普通变量和指针变量

    普通变量:(变量名字name,变量值value,变量的内存地址addr)
    指针变量:(变量名字name,变量值value,变量的内存地址addr)
    

    从表面上看,普通变量和指针变量没有多大区别。实质上的区别是:指针变量的变量值value 存储的是一个用16进制表示的32位内存地址,比如00A6F790。而普通变量的变量值value 所存储的内容没有限制。还有,指针变量能够根据变量值value中的内存地址获取到该地址所对应的值(假设指针变量名为p,通过*p来获取)。具体看下面的关系图:

    这里写图片描述
    其中,上图中变量的定义为:

    int commonVar = 12;
    
    ///
    string str = "hello";
    string * poiterVar = &str;
    

    poiterVar = “00ER343O”
    *poiterVar = “hello”;
    所以,指针变量和普通变量没有太大区别。

    ###3、 一级指针和二级指针的关系

    那么,对于指针的指针呢?

    这里写图片描述
    上图中两个指针的定义为:

    string str = "hello";
    string *poiterVar1 = &str;
    string **poiterVar2 = &poiterVar1;
    

    暂时不要考虑*星号,避免被星号搞混了。星号的作用有两个,一是在指针定义的时候表明该变量是指针变量以及是几级指针(有几个星号就表示几级),二是能够通过指针变量所指向的内存地址(或者说上图中Value的值)来获取对应内存的内容。比如上图中的poiterVar1通过Value = 00ER343O来获取hello,即*poiterVar1

    从上图中还可以看出,一级指针poiterVar1和二级指针poiterVar2没有什么区别。如果非要说出一点区别的话,就是在指针定义的时候,后者多加了一个*星号。

    指针变量修改所指向的内容的时候,因为指针指向的是其内存地址,所以,就相当于把该内存中的内容修改了。这一点是指针强大的原因所在,也是它存在的原因。


    4、实例讲解1

    这里写图片描述
    上图中两个指针的定义为:

    string *poiterVar1 = NULL;
    string **poiterVar2 = &poiterVar1;
    

    指针变量poiterVar1初始化的时候指向了NULL。可以通过poiterVar2修改poiterVar1,让它指向一个非NULL的内容吗? 是可以的。怎么做到呢?
    问题可以转换为:让pointerVar1中的Value等于一个有效的内存地址。具体怎么做呢?因为poiterVar2拥有poiterVar1的内存地址,所以,可以通过poiterVar2来修改poiterVar2变量中的值(也就是它的Value)。具体如下:

    string *poiterVar1 = NULL;
    string **poiterVar2 = &poiterVar1;
    
    string str = "hello";
    
    /*
    if (*poiterVar2 == poiterVar1) 
    	cout << "*poiterVar2 == poiterVar1" << endl;
    else 
    	cout << "*poiterVar2 != poiterVar1" << endl;
    */
    
    *poiterVar2 = &str;
    
    cout << *poiterVar1 << endl;
    
    //执行结果
    //*poiterVar2 == poiterVar1
    //hello
    

    上面代码中,*poiterVar2 代表poiterVar1的Value,把str的内存地址赋值给*poiterVar2 就可以了。


    5、实例讲解2

    本实例和第一个实例基本相同,只是把string类型变成了自定义的Teacher类型。开始的时候Teacher类型的指针为NULL,通过一个二级指针让一级指针指向一个有效的内存空间。也是指针的指针的问题,一级指针是teacherObj,二级指针是pTeacher(函数的参数)。
    这里写图片描述

    在代码中它们的关系可以表示为:

    Teacher *teacherObj = NULL;
    Teacher **pTeacher = &teacherObj;
    

    所以,这个实例和第一个实例是一样的。

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct Teacher {
    	int age;
    	char* name;
    };
    
    int getTeacher(Teacher **pTeacher){
    	if (pTeacher == nullptr)return -1;
    	Teacher * tmpTeacher = (Teacher*)malloc(sizeof(Teacher));
    	if (tmpTeacher == nullptr) return -1;
    	tmpTeacher->age = 32;
    	tmpTeacher->name = "Liangyihuai";
    	*pTeacher = tmpTeacher; //*pTeacher就代表一级指针的value值。
    	return 1;
    }
    
    int main() {
    
    	Teacher *teacherObj = NULL;
    	
    	getTeacher(&teacherObj);
    
    	cout << teacherObj->age << " " << teacherObj->name << endl;
    
    	system("pause");
    	return 0;
    }
    

    拓展:
    上面的getTeacher方法也可以写成:

    int getTeacher2(Teacher* &pTeacher) {
    	Teacher * tmpTeacher = (Teacher*)malloc(sizeof(Teacher));
    	if (tmpTeacher == nullptr)return -1;
    	tmpTeacher->age = 32;
    	tmpTeacher->name = "Liangyihuai";
    	pTeacher = tmpTeacher;
    	return 1;
    }
    
    //在main函数中:
    //Teacher *teacherObj = NULL;
    //getTeacher2(teacherObj);
    

    其中引用pTeacher表示teacherObj,也就是pTeacher是teacherObj的一个别名,而teacherObj是一个指针变量,所以,让pTeacher等于一个有效的内存空间就可以了。

    6、总结:

    本文讲解了指针变量和普通变量的区别。分析了二级指针和一级指针的区别和本质,以及如何使用二级指针修改一级指针所指向的内存空间。如果有误,欢迎指教。

    展开全文
  • 二级指针(概念及用法)

    千次阅读 2016-04-11 21:30:53
    二级指针二级指针:指向指针的指针。一级指针与二级指针的比较:一级指针的值为地址,地址需要空间来存放,是空间就具有地址 ,二级指针就是为了获取这一空间的地址。一级指针所关联的是其值(一个地址)名下空间里...

    二级指针

    二级指针:指向指针的指针。

    一级指针与二级指针的比较:一级指针的值为地址,地址需要空间来存放,是空间就具有地址
    ,二级指针就是为了获取这一空间的地址。一级指针所关联的是其值(一个地址)名下空间里
    的数据,这个数据可以是任意类型并做任意用途,但二级指针所关联的数据只有一个类型一个
    用途,就是地址。

    指针的用途:提供目标的读取或改写,而二级指针就是对于内存地址的读取和改写。

    二级指针分为指向指针变量的指针和指向数组的指针。

    例1、(简单的指向指针变量的指针)
    int main()
    {
    int k,*p,**pp;
    k=8;
    p=&k;
    pp=&p;
    printf(“k=%d,p=%d,p=%d\n”,**pp,*pp,p);
    return 0;
    }

    例2、(指向数组的指针)

    include

    展开全文
  • 理解二级指针

    2020-08-26 15:48:39
    对于一个普通变量,进行引用操作,得到的是一级指针。如int a=0;int p=&a,则&a就是一级指针。因为&a的值就是a的地址,p的值也是a的地址,则&a和p就是一级指针变量(简略为指针),对&a进行解...

    一、明确概念

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

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

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

    二、二级指针

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

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

       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;
    
    • 二级指针一般用在需要修改函数外部指针的情况。因为函数外部的指针变量,只有通过二级指针解引用得到外部指针变量在内存单元的地址,修改这个地址所指向的内容即可。

    三、总结

    • 对于C语言的参数传递都是值传递,当传传递一个指针给函数的时,其实质上还是值传递,除非使用双指针。
    • 指针变量,首先它也是一个变量,在内存单元中也要占用内存空间。一级指针变量指向的内容是普通变量的值,二级指针变量指向的内容是一级指针变量的地址。
    展开全文
  • 二级指针的作用详解

    万次阅读 多人点赞 2015-06-26 10:13:19
    一、概念 在如下的A指向B、B指向C的指向...B是一个指针变量,其中存放着C的地址,但是B也要占空间的啊,所以B也有地址,B的起始地址是0x00000004,但是B内存中存放的是C的地址,所以B里面的内容就是0x00000008。 那么到此
  • #include "stdlib.h" #include "stdio.h" #include &lt;iostream&gt; using namespace std; void show() { std::cout&lt;&lt;"this is show"...this is
  • 二级指针

    2018-03-09 23:22:12
    对于一个普通变量,进行引用操作,得到的是一级指针。如int a=0;int *p=&amp;a,则&amp;a就是一级指针。因为&amp;a的值就是a的地址,p的值也是a的地址,则&amp;a和p就是一级指针变量(简略为指针)...
  • 一级指针, 二级指针

    千次阅读 2018-01-23 16:24:05
    级指针  通常用作,函数的输入参数,因为一级指针作为函数参数,在调用的时候,实参和形参是不同的内存空间,只是,这个内存空间存放的指针指向的是同一块地址 ,所以形参在函数执行中可以访问实参指向的内存...
  • 二级指针**P

    千次阅读 2014-10-13 08:47:46
    1.对于一个普通变量,进行引用操作,得到的是一级指针。如int a=0;int *p=&a,则&a就是一级指针。因为&a的值就是a的地址,p的值也是a的地址,则&a和p就是一级指针变量(简略为指针),对&a进行解引用操作,int b=*&a...
  • 指针(一级指针,二级指针

    千次阅读 2019-06-06 09:16:41
    级指针 指针就是地址。 指针变量:代表地址的变量。 指针指向元素; int a = 10; int * P = &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;a; 这里面的 P 就是一个一级指针,它指向的是 a 的...
  • 一级指针与二级指针

    2019-08-17 23:34:36
    一、一级指针 如下图所示,整型指针xptr指向变量x的地址。 int *xptr; int x=10; xptr = &x; 源码: #include <stdio.h> int main() { int *xptr = NULL; int x = 10; xptr = &x; printf...
  • C语言中的二级指针(双指针)

    万次阅读 热门讨论 2012-02-07 13:57:49
    原创作品,转载请标明出处...C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针。C++中可以使用引用类型来实现。下面讲解C中的二级指针的使用方法。例如我们使用指针来交换两
  • (*ppBuf) = (char *)malloc(nLen * sizeof(char));     return ((NULL == (*ppBuf)) ? FALSE : TRUE);  }    void FreeStrBuf(char **ppBuf)  {   if (NULL !... 
  • C/C++二维数组名和二级指针

    万次阅读 多人点赞 2016-06-26 16:13:15
    二维数组名不能赋值给二级指针,否则运行中可能会出现错误。
  • 那么能够通过传指针改变指针所指向的地址吗?在解决这个问题之前,也许我们应该先了解指针非常容易混淆的三个属性: ①.指针变量地址(&p) ②.指针变量指向的地址(p,存储数据的地址) ③.指针变量指向的...
  • 二级指针作为函数形参时,能作为函数实参的是二级指针,指针数组,一级指针的地址 b.当数组指针作为函数形参时,能作为函数实参的是二维数组,数组指针 c.当二维数组作为函数形参时,能作为函数实参的是二维数组...
  • 二级指针三种用法总结

    千次阅读 2019-06-04 10:51:03
    1.在栈区建立数组,指向常量区数据...这种用法可以通过二级指针进行传参 void PrintfStr(char **cpoint); 当想访问“111111”时的时候 采用以下两种方法 1:printf("%s",cpoint[0]); 2:printf("%s",*(cpoint...
  • 指针做形参

    千次阅读 2011-11-25 17:21:37
    一级指针和二级指针在做形参时的不同:指针用作形参,改变指针地址则值不能传回,改变指针内容而地址不变则值可以传回。   (特殊情况:改变指针地址采用返回值也可以传回地址) 对于一级指针,做形参时传入...
  • 全国计算机等级考试——C语言二级 题库

    千次阅读 多人点赞 2019-01-19 12:29:14
    计算机C语言二级考试(题库11) 一、选择题 2、下列叙述中正确的是( ) A)循环队列中的元素个数随队头指针与队尾指针的变化而动态变化 B)循环队列中的元素个数随队头指针的变化而动态变化 C)循环队列中的元素个数随...
  • 目录 一.变量的内存实质到 1.1变量的实质 1.2 赋值给变量 1.3变量在哪里?...二....三. 二级指针(指针的指针) ...3.2.3二级指针的步长 四. 指针与数组 4.1 指针与数组名 4.1.1 通过数组名访问数组元素 4....
1 2 3 4 5 ... 20
收藏数 238,340
精华内容 95,336
关键字:

二级指针