你好,游客 登录 注册 搜索
背景:
阅读新闻

C++指针之(易错模型)

[日期:2015-07-12] 来源:Linux社区  作者:CentForever [字体: ]

规则一:Main(主调函数)分配的内存(在堆区,栈区、全局区)都可以在被调用函数里使用。如果在被调用函数里面的临时区(栈)分配内存,主调用函数是不能使用的。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

char * getstring1()
{
    char *p1 = "abcde";
    return p1;
}

char * getstring2()
{
    char *p2 = "abcde";
    return p2;
}

char * getstring3()
{
    char buf[30];
    strcpy(buf, "abcde");
    return buf;
}

void main()
{
    int i= 0;

    //指针指向谁就把谁的地址赋给指针变量。
    char *p1 = getstring1();
    char *p2 = getstring2();
    char *******    p3 = NULL; //p3 是个变量
    char *p4 = getstring3();

//    printf("p1:%s\n", p1);
//    printf("p2:%s\n", p2);
//
//    printf("p1:%d\n", p1);
//    printf("p2:%d\n", p2);

    printf("p4:%s\n", p4);


    //指针变量和它所执行的内存空间变量是两个不同的概念
    strcmp(p1, p2);

    system("pause");
}

 

规则二:间接赋值,注意内存冲突。

 

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
//看见一级指针,要去分辨指针的输入输出特性
//指针的输入特性:在主调函数里面分配内存,在被调用函数里面使用
//指针的输出特性:在被调用函数里面分配内存,主要是把运算结果甩出来
int getLen3(int *p /*in out*/)
{
    //*(NULL) = 40;
    //*(0)  = 40;
    *p = 40; //间接赋值 如果p是a的地址,那么就间接的修改a的值          //*p形参,去间接的修改实参的值
}
void main()
{
    int    a = 10; //定义了一个变量(实参)//a看成0级指针
    int *    p = NULL; ////定义了一个变量(形参)//1级指针
    a = 20; //直接修改a的值
    printf("a:%d \n", a);
    //p = &a; //a的地址赋给p //把一个变量去地址传给另外一个变量 //实参取地址传给形参
    getLen3(p);
    getLen3(NULL);   
    printf("a:%d \n", a);
    system("pause");
}   


//*(NULL) = 40;
//*(0)  = 40;
getLen3(NULL);

不同的编译器会有不同的提示。地址为为零的内存空间归系统所以,程序修改里面的内容,会出错。

本文永久更新链接地址http://www.linuxidc.com/Linux/2015-07/119793.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款