C語言程序設(shè)計(第6章指針)5

字號:

6.5 指針的地址分配
     我們可以定義指針變量指向任何類型的變量。在上述的處理過程中,指針變量指向的變量通過傳遞變量的地址來實現(xiàn)。指針變量的取值是內(nèi)存的地址,這個地址應(yīng)當(dāng)是安全的,不可以是隨意的,否則,寫入內(nèi)存單元的值將會使得已存放的數(shù)據(jù)或程序丟失。應(yīng)使用編譯系統(tǒng)提供的標(biāo)準(zhǔn)函數(shù)來實現(xiàn)地址分配。
     ANSI標(biāo)準(zhǔn)建議設(shè)置了兩個最常用的動態(tài)分配內(nèi)存的函數(shù)malloc() 和free( ),并包含在stdlib.h中,但有些C編譯卻使用malloc.h包含。使用時請參照具體的C編譯版本。
     我們這里所指的動態(tài)內(nèi)存分配其含義是指:當(dāng)定義指針變量時,其變量的取值是隨機(jī)的,可能指向內(nèi)存的任一單元。若指針的指向是不安全的內(nèi)存地址,在該地址空間上的數(shù)據(jù)交換就會產(chǎn)生意料不到的效果。為此,在程序的執(zhí)行過程中,要保證指針操作的安全性,就要為指針變量分配安全地址。在程序執(zhí)行時為指針變量所做的地址分配就稱之為動態(tài)內(nèi)存分配。當(dāng)無需指針變量操作時,可以將其所分配的內(nèi)存歸還系統(tǒng),此過程我們稱之為內(nèi)存單元的釋放。malloc( )用以向編譯系統(tǒng)申請分配內(nèi)存; free( )用以在使用完畢釋放掉所占內(nèi)存。
    [例6-21] 兩個字符串的交換。
    #include
    #include
    #include
    main( )
    {
     char *ptr1,*ptr2,*temp;
     ptr1=malloc(30); /*動態(tài)為指針變量分配長度為3 0字節(jié)的存儲空間* /
     ptr2 = malloc(20);
     temp = malloc(30);
     printf("input str1:");
     gets(ptr1); / *輸入字符串* /
     printf("input str2:");
     gets(ptr2);
     printf("str1------------str2\n");
     printf("%s.......%s\n", ptr1, ptr2);
     strcpy(temp,ptr1); /* 串復(fù)制*/
     strcpy(ptr1, ptr2);
     strcpy(ptr2,temp);
     printf("str1------------str2\n");
     printf("%s.......%s\n",ptr1,ptr2);
     free(ptr1);
     free(ptr2);
    }
     為指針變量分配的存儲空間長度取決于存放字符的多少。在上述的程序中,兩個串的交換可以通過標(biāo)準(zhǔn)函數(shù)strcpy() 來完成,也可以通過串指針交換指向完成,用temp=ptr1;
     ptr1 = ptr2;ptr2 = temp;三條賦值語句實現(xiàn)。但是,利用指針交換指向,其物理意義與串通過函數(shù)進(jìn)行的復(fù)制完全不同。前者是存放串地址的指針變量數(shù)據(jù)交換,后者是串在內(nèi)存物理空間的數(shù)據(jù)交換。指針變量用完后,將指針變量所占的存儲空間釋放。
    運(yùn)行程序:r u n
    input str1: China
    input str2: Chengdu
    str1------------str2
    China----------Chengdu
    str1------------str2
    Chengdu----- China