指针形参,二级指针改值

程序:

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

void change(char *a)
{//副本
    printf("change 1:%s\n", a);
    a="change";//实参副本指向改变,不影响实参的指向
    printf("change 2:%s\n", a);
}
void change2(char **a)
{
    printf("change2 1:%s\n", *a);
    *a="changea";//a本身不变,改变a指向内存的内容,a指向内存是指针a,改变指针a的指向,原来的指针a指向内容是不变的
    printf("change2 2:%s\n", *a);
}
void change3(char *a)
{
    printf("change3 1:%s\n", 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\n", a);
    // free(b);
}

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

    change2(&a);//传入二级指针
    printf("main 2:%s\n", a);//改变为change2中赋予的值
    printf("main 2 a1:%s\n\n", a1);//change2只是将a重新指向了新值,而原指向的值 即a1指向的值是不变的

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

    int c=90;
    change4(&c);
    printf("main 4:%d\n\n", c);//不改变,还是90

    change5(&c);
    printf("main 5:%d\n\n", c);//改变为change5赋予的新值

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

    return 0;
}

结果:

原文地址:https://www.cnblogs.com/beixiaobei/p/9726501.html

时间: 2024-10-10 18:04:06

指针形参,二级指针改值的相关文章

指针数组,数组指针,指针函数,函数指针,二级指针详解

先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型.所以char *p[4]是四个指针,这四个指针组成了一个数组,称为指针数组,既有多个指针组成的数组. char(*p

关于一级指针和二级指针的简单见解

一级指针形式如: int *p二级指针形式如: int **p 可能很多初学者会疑惑在函数参数里面到底应该用一级指针还是二级指针. 下面用几个例子说明一下: 第一个是大家都很熟悉的链表 下面是一个链表结构:   typedef struct Node{ int value; struct Node *next;} 对于添加数据到链表尾部这个函数,传入的参数必须是一个二级指针. 在传参的时候发生的赋值动作是: Node *hNode;Node **pNode = &hNode; pNode指向了h

C语言一级指针、二级指针、数组作为参数传递需要注意的若干问题

在C语言编程时,经常会用到指针或数组作为参数传递,但有时结果却并不是自己想要的.下面总结下指针.数组作为参数传递需要的问题. 一级指针与二级指针的使用范围: 一级指针存放变量的地址,指向的值是变量的内容.如int* p={1,2,3}, p=数组的首地址,*p=数组的第一个值: 二级指针存放一级指针的地址,指向一级指针.如int*p ={1,2,3}, int**pp=&p,pp=指针p的首地址,*pp=数组的首地址,**pp=数组第一个值1. 在作为参数传递时什么时候用一级指针,什么时候用二级

(C++)函数参数传递中的一级指针和二级指针

(C++)函数参数传递中的一级指针和二级指针 主要内容: 1.一级指针和二级指针 2.函数指针传递的例子 3.什么时候需要传递二级指针? 4.二级指针在链表中的使用 1.一级指针和二级指针 一级指针:即我们一般说的指针,就是内存地址: 二级指针:指向指针的指针,就是地址的地址: 如: int a=1; int *p=&a; // p为a变量的地址,通过*p可以得到a的值 int **q=&p; // q为p指针的地址,通过**q可以得到a的值 2.函数指针传递的例子 程序1: 1 2 3

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

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

C语言一级指针与二级指针

指针的概念 指针就是地址, 利用这个地址可以找到指定的数据 指针就是地址, 那么在使用的时候, 常常会简单的说 指针变量为指针 指针变量就是存储地址的变量 int *p1;// 申请了一个变量, 即在内存中开辟了一块内存, 存储数据 // 开辟了 8 个字节, 在 Mac 下 指针都占 8 个字节 使用指针, 实际上应该说成使用指针变量 1> 算术运算 +1 移动几个字节? 看类型: int *,  long *,  char * 2> 获得地址表示的数据 指针里面存储的是地址, 就可以将该地

C指针--通过二级指针往回拉数据

现在有这种需求,在main函数中建立一个二叉树的root结点的指针,在tree_create函数中malloc或者new一个二叉树结点,然后在main函数中能正常的访问这个新建的结点. 注:这里的tree_create的返回值为void,也就是说不能通过函数的返回值返回指向结点的指针. 能想到的办法就是通过二级指针往回拉结点的数据.具体的实现流程是这样的: void tree_create(tree **tmp); int main(void) { tree *T = NULL;//T是二叉树结

一级指针以及二级指针

我想不大理解二级指针的根源是我对程序对堆栈的用法还不够深入了解. 采用一级指针最好是方便修改指针对象的值,采用二级指针最好是方便修改指针的值. #include <iostream> #include <stdio.h> using namespace std; class haha { }; void main() { haha *p(new haha); printf("%p\n", p);//一级指针的地址 printf("%p\n",

从一级指针到二级指针

昨天,写了一些关于一级指针的见解,那么这次我们再来看看二级指针的一些用法,也可以说是我自己的一些见解 所谓二级指针其实和一级指针差不多,一级指针是存储0级指针地址的变量,(一定要记住这一点:指针也是变量,编译器会给它分配内存空间,它的内存空间和它指向的内存空间是不同的,它的内存空间里只能存储空间地址:)所以二级指针就是储存一级指针地址的变量,或者说二级指针是指向一级指针空间的变量:还可以说是指向一级指针的指针: 那么下面我们来看代码: void changePointer(char **c) {

一级指针,二级指针,指针数组,数组和指针

指针和数组指针是个用来存放地址的变量:&arr表示整个数组:arr数组名表示首元素的地址:指针解引用即表示指针所指向的内容比如:char ptr="abcdef";ptr; //指针解引用即表示它所指向的内容,即abcdefptr; //ptr里保存的是字符串的地址2.一级指针一级指针就是指指针,里面放的就是元素的地址,我们可以通过访问元素的地址来找到该地址里存放的内容,即元素本身.比如:char str1[ ]={1,2,3,4,5,6,7};3.二级指针二级指针就是指向一级