歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++指針之(易錯模型)

規則一: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);

不同的編譯器會有不同的提示。地址為為零的內存空間歸系統所以,程序修改裡面的內容,會出錯。

Copyright © Linux教程網 All Rights Reserved