指针

  • 函数传参方式是值传递
    形参其实也是个局部变量,出了函数就没了,所以怎么赋值怎么修改都没用。
#include <bits/stdc++.h>
using namespace std;
void A(char *p){
    p=(char*)malloc(100);
}
int main(){
    char* str=NULL;
    printf("%x\n",str);
    //str仍然是空指针,函数不能改变形参。
    A(str);
    printf("%x\n",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\n",str);
    A(&str);
    printf("%x\n",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\n",a);
    a=A();
    printf("%x\n",a);
//    printf("%s\n",a);
    char* b=NULL;
    printf("%x\n",b);
    b=B();
    printf("%x\n",b);
//    printf("%s\n",b);
    char* c=NULL;
    printf("%x\n",c);
    c=C();
    printf("%x\n",c);
    printf("%s\n",c);
    return 0;
}
posted @ 2020-01-27 21:45  Keane1998  阅读(108)  评论(0编辑  收藏  举报