指针

  • 函数传参方式是值传递
    形参其实也是个局部变量,出了函数就没了,所以怎么赋值怎么修改都没用。
#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;
}

原文链接: https://www.cnblogs.com/zxcoder/p/12236975.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    指针

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/325284

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午3:16
下一篇 2023年3月1日 下午3:16

相关推荐