zoukankan      html  css  js  c++  java
  • 指针形参,二级指针改值

    程序: 

    #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指向地址的值
       //a[0]='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";//此为字符串常量(不可修改其值,内存中仅一份),编译会警告,最好加上const。若要修改最好放到数组中char s[]="main";“main”这样的字符串常量会生成一个指向字符的常量指针,所以sizeof(s)=指针大小4/8,不可s[0]=="p"而应'p' 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; }

    结果:

  • 相关阅读:
    Windows性能调优: Perfomn.exe 和Perfmon /res
    WPF:逻辑树和视觉树
    AD FS 概述
    SQL Server : TRUSTWORTHY 数据库属性
    WCF:在开发期间应该注意的问题
    ASP.NET MVC 2中的数据验证
    SQL Server:如何在Service Broker发送消息验证失败后获取源消息
    GDI+:自定义控件时如何使用Region来输出特定区域
    LINQ to XML:如何替换XCData的内容
    javascript是否真的就不能实现跨站请求呢?
  • 原文地址:https://www.cnblogs.com/beixiaobei/p/9726501.html
Copyright © 2011-2022 走看看