指针形参,二级指针改值

Posted beixiaobei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针形参,二级指针改值相关的知识,希望对你有一定的参考价值。

程序: 

#include <stdio.h>
#include <stdlib.h>

void change(char *a)
{//副本
    printf("change 1:%s
", a);
    a="change";//实参副本指向改变,不影响实参的指向
    printf("change 2:%s
", a);
}
void change2(char **a)
{
    printf("change2 1:%s
", *a);
    *a="changea";//a本身不变,改变a指向内存的内容,a指向内存是指针a,改变指针a的指向,原来的指针a指向内容是不变的
    printf("change2 2:%s
", *a);
}
void change3(char *a)
{
    printf("change3 1:%s
", a);
    // char *b=(char *)malloc(sizeof(char)*10);//malloc分配堆内存(但b本身是在栈中。栈分配:char b[10],函数返回即释放),除非free否则程序退出都不会释放
    // a=b;
    sscanf("changeb", "%s", a);//直接改变a指向地址的值
    printf("change3 2:%s
", a);
    // free(b);
}

void change4(int *a)
{//副本
    printf("change4 1:%d
", *a);
    int b=80;
    a=&b;//用实参的副本,副本指向变了,但不影响原实参的指向。除非改变原实参指向的值,即change5
    printf("change4 2:%d
", *a);
}
void change5(int *a)
{
    printf("change5 1:%d
", *a);
    *a=80;//a本身不变,改变a指向内存的内容
    printf("change5 2:%d
", *a);
}
void change6(int **a)
{
    int b=70;
    printf("change6 1:%d
", **a);
    *a=&b;//和change2一样
    printf("change6 2:%d
", **a);
}
int main(){
    //
    char *a = "main";
    char *a1=a;
    change(a);//传入一级指针,函数内使用是该指针的副本
    printf("main 1:%s

", a);//不改变,此处为main

    change2(&a);//传入二级指针
    printf("main 2:%s
", a);//改变为change2中赋予的值
    printf("main 2 a1:%s

", a1);//change2只是将a重新指向了新值,而原指向的值 即a1指向的值是不变的

    char b[10] = "mainb";//不能此处char *b,而函数内不分配内存,否则sscanf报错段吐核
    // char *b="xx";
    change3(b);
    printf("main 3:%s

", b);//改变为change3中sscanf赋予的值

    int c=90;
    change4(&c);
    printf("main 4:%d

", c);//不改变,还是90

    change5(&c);
    printf("main 5:%d

", c);//改变为change5赋予的新值

    int *d=&c;//和change2一样
    int *d1=d;
    change6(&d);//传入二级指针
    printf("main 6:%d
", *d);//改变
    printf("main 5:%d

", *d1);//原c值

    return 0;
}

 

结果:

技术分享图片

 

以上是关于指针形参,二级指针改值的主要内容,如果未能解决你的问题,请参考以下文章

20160210.CCPP体系详解(0020天)

C 语言二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一二 模型数据拷贝到 三 模型中 并 排序 )

20160210.CCPP体系详解(0020天)

C 语言多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )

20160211.CCPP体系详解(0021天)

二级指针及函数传参和形参问题