• 指针


    • 函数传参方式是值传递
      形参其实也是个局部变量,出了函数就没了,所以怎么赋值怎么修改都没用。
    #include <bits/stdc++.h>
    using namespace std;
    void A(char *p){
        p=(char*)malloc(100);
    }
    int main(){
        char* str=NULL;
        printf("%x
    ",str);
        //str仍然是空指针,函数不能改变形参。
        A(str);
        printf("%x
    ",str);
        return 0;
    }
    
    • 换成二级指针
      传递一个二级指针,二级指针指向一个一级指针,所以可以修改。
    #include <bits/stdc++.h>
    using namespace std;
    void A(char **p){
        *p=(char*)malloc(100);
    }
    int main(){
        char* str=NULL;
        printf("%x
    ",str);
        A(&str);
        printf("%x
    ",str);
        return 0;
    }
    
    • 返回数组/返回指针
      A函数返回一个局部变量,s指向的内存地址已经清空了,所以得到一个空指针。
      B函数返回的指针还在,但是由于函数已经返回,栈被清空,所以指针指向的内存可能被其他程序所使用。
      这里涉及到字符数组和字符指针的区别:
      • 如果是char* s="Hello",字符串常量"Hello"是存放在常量区,而指针s是作为局部变量存放在栈区,s的值就是字符串所在内存的地址。
      • 如果是char s[]="Hello",这里的字符数组和s这个变量都是存储在栈区。
      • 常量区的字符串常量是不能修改的。
    #include <bits/stdc++.h>
    using namespace std;
    char* A(){
        char s[]="Hello World";
        return s;
    }
    char* B(){
        char* s="Hello World";
        return s;
    }
    char* C(){
        static char s[]="Hello World";
        return s;
    }
    int main(){
        char* a=NULL;
        printf("%x
    ",a);
        a=A();
        printf("%x
    ",a);
    //    printf("%s
    ",a);
        char* b=NULL;
        printf("%x
    ",b);
        b=B();
        printf("%x
    ",b);
    //    printf("%s
    ",b);
        char* c=NULL;
        printf("%x
    ",c);
        c=C();
        printf("%x
    ",c);
        printf("%s
    ",c);
        return 0;
    }
    
  • 相关阅读:
    默比乌斯函数
    勒让德符号相关
    微积分入门("SX"T版)
    分治法求2n个数的中位数
    SSM框架学习之高并发秒杀业务--笔记1-- 项目的创建和依赖
    10月9日Android学习笔记:活动与服务之间的通信
    高精度加法
    Windows环境下多线程编程原理与应用读书笔记(4)————线程间通信概述
    郁闷
    素数链
  • 原文地址:https://www.cnblogs.com/zxcoder/p/12236975.html
Copyright © 2020-2023  润新知