一重指针和二重指针

今天从函数传参的角度来理解指针。如果想交换两个变量a,b的值,我们会这么做:

int temp;

temp = a;

a = b;

b = a;

如果要把以上功能封装成一个函数,最开始的反应是:

func(int a,int b)

{

int temp;

temp = a;

a = b;

b = a;

}

但是func(a,b);这个函数执行完之后,a和b的值并没有交换。变换的只是函数内部的临时变量。以上这种方式无法改为函数外部的变量——a和b。

那么在函数的内部如何改变外部的变量呢,答案是指针。

func(int* a,int* b)

{

int temp;

temp = *a;

*a = *b;

*b = *a;

}

func(&a,&b);

指针就有这个特权,当函数参数是一个一重指针的时候,那么传入的就应该是变量的地址。

那么在函数的内部就可以直接通过修改该地址中存放的值。这样就能修改到外部变量的值了。

现在进一步思考,如果函数内部不是修改变量的值,而是指针的值及变量地址的值,又会怎样呢?没错这回就得用到二重指针。

可能有人会问,修改指针的值是想干嘛?修改指针的值的另一种说法就是:将指针指向另一个变量,或者是为指针分配一个新的空间。

比如 int* p = a,如果需要将其封装成函数,就会造成在函数中修改指针值的情况。假设一个功能函数需要为指针分配一个新的空间:

func(int* a)

{

a = new int();

}

假设函数外部现在有个一个指针int* p,func(p);执行完了之后,指针p仍然没有分配到新的空间。

道理和第一个例子是一样的,变的只是函数内部临时变量指针a的值,p并没有改变。

要想改变P的值:

func(int** a)

{

(*a) = new int();

}

那么要传入的参数就是指针的地址值:&p 。func(&p);

这样函数内部就能修改外部指针的值。

总结:

函数内部修改外部变量的值,需要一重指针;

函数内部修改外部指针变量的值,需要二重指针;

时间: 2024-10-09 17:26:07

一重指针和二重指针的相关文章

数组指针和指针数组和二重指针

数组指针和指针数组从字面上来看很纠结,有时候我也搞不清,分不清哪样的是数组指针,哪样的是指针数组.这东西就不是靠记忆的,我们采取分析加对比分层剥离的方法分析. 1.概念区别 1.1.数组指针:定语在前,主语在后.也就是数组的指针.一个指针,它指向一个数组. 1.2.指针数组:定语在前,主语在后.也就是指针 的数组.一个数组,里面的元素都是指针. 2.指针和数组分别定义的符号 2.1 int * p; 分析: 第一步:找核心,核心是p. 第二步:逐层剥离,p和*结合是指针.所以int*p;是定义了

C语言二重指针与malloc

(内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include <stdio.h> int main() { char *s = "I love you"; char *s1 = "you love me"; char *s2 = "she love you"; char *s3 = "he l

C语言 二重指针深入理解

k->[sss] ------>k是指针,指向内存区,内存区存的数据是sss   ,那么,*K的内容就是sss           (*k)<==>sss sss->[hhh]---->sss是新的地址,是指针,指向内存区域,内存区域的数据是hhh,那么,*sss的内容就是hhh     (*sss)<==>hhh 综上所述,二重指针(*(*k))=====>就等于hhh 也就是取k地址的内容作为一个新的地址,然后再取这个新的地址的内容 2.思考链表

C基础--二重指针和数组指针

#include <stdio.h> int main1(void) { int a = 3; int b = 8; int *p = &a; // int* p = &a; int **q; // int** q; q = &p; **q = 10; *q = &b; **q = 5; p = &b; *p = 9; printf("a = %d\tb = %d\n", a, b); return 0; } //void fun(c

指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为参数,泛型函数

 1.指针数组 数组里面的每个元素都是指针. 指针数组的案例如下: 易犯错误: 2.数组指针 归根结底还是指针,只是取*的时候能够取出一整个数组出来. 数组指针:(一个指针指向了数组,一般和二维数组搭配使用). 下面的(p+1)表示的是加过20个字符. 3.函数指针: 在gcc编译的时候增加一些调试信息的方式是: gcc demo.c –g –o app   -g表示增加一些调试信息 objdump –dSsx app > file   将app反汇编,然后重定向到file文件中.函数指针定

指针做参数的动态内存分配与二重指针(上)

C中的动态内存分配问题: 格式:Int *pointer; Pointer = (int *)malloc(100 * sizeof(int)); 可以在被调用函数(该函数返回指针的函数)中动态分配内存,(并且该内存是分配在堆内存中的,故而被调函数可以返回指向该堆内存的指针),然后返回该指针值,该指针指向动态分配的内存,然后可以在主函数中free掉pointer.哪怕在主函数中将该指针值赋值给pointer_2,free掉pointer_2也是可以的,(可以理解的,它们都指向该堆内存),以避免出

指针做参数的动态内存分配与二重指针(下)

要实现指针作为函数形参,改变实参指针的值.一般有两种做法: 使用双指针,或者指针数组形式作为形参,将实参的地址传入函数,也即要给形参传入指针的地址! http://blog.csdn.net/liuyajun2013/article/details/17151309#0-tsina-1-79483-397232819ff9a47a7b7e80a40613cfe http://www.cnblogs.com/heat-man/p/4646051.html http://www.jb51.net/a

二维数组与二重指针

1.二重指针 1.1应用场景(1)二重指针编程中多数是和指针数组结合起来用 int **p1; int *p2[5]; p1=p2; (2)有时在函数传参时通过函数内部改变外部的一个指针变量,会以二重指针的方式把这个外部指针变量的地址传进去. void func(int **p) { *p = (int *)0x22222222; } int main(void) { int a=10; int *p3=&a; printf("change before=%p.\n.",p);

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针