zoukankan      html  css  js  c++  java
  • 指针

    • 函数传参方式是值传递
      形参其实也是个局部变量,出了函数就没了,所以怎么赋值怎么修改都没用。
    #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;
    }
    
  • 相关阅读:
    博客搬家了
    Unity Shader学习笔记(一)坐标变换
    cs106a编程方法学作业解答(4)(Hangman)
    cs106a编程方法学 作业解答(4)
    cs106a编程方法学作业解答(3)
    暗黑破坏神2修改盒子公式的方法
    cs106a编程方法学作业解答(2)
    cs106a编程方法学作业解答 (1)
    MAC入手达成
    深圳面试一周记录——.NET(B/S)开发
  • 原文地址:https://www.cnblogs.com/zxcoder/p/12236975.html
Copyright © 2011-2022 走看看