C/C++指針、數組與內存管理(一)

在C/C++中,指針應該是一個難點。在之前也是自己的一個薄弱點,還好在今年轉到應用層之後對指針的理解加深了,在此也做個總結。

說到指針,總是和內存管理分不開。內存管理在一個程序中的重要性不用多說。

指針和數組的區別

1.數組名不是指針。

#include <stdio.h>

int main()
{
    char str[10];
    char *pstr;
    printf("length: str = %d, pstr = %d\n", sizeof(str), sizeof(pstr));
    return 0;
}

得出的結果:

length: str = 10, pstr = 8

在某些系統下指針的長度可能是4個字節,都不等於10,所以數組名不是指針。

2.數組名有某些指針的特性

#include <stdio.h>
#include <string.h>

int main()
{
    char str1[12] = "hello world";
    char str2[12];
    strcpy(str2, str1);
    printf("str1 = %s, str2 = %s\n", str1, str2);
    return 0;
}

輸出結果:

str1 = hello world, str2 = hello world

strcpy函數的兩個形參是char *類型的指針,但我們卻給它傳了兩個數組名。在數組字符串中,數組名是數組第一個元素的地址,相當於該字符串的首地址,類似指針指向字符串的首地址。數組名代表了數組的首地址。

從某本書上抄來的對數組名的三個結論:

(1)數組名的內涵在於其指代實體是一種數據結構,這種數據結構就是數組

(2)數組名的外延在於其可以轉換爲指向其指代實體的指針,而且是一個指針常量;

(3)指向數組的指針則是另外一種變量類型,僅僅意味着數組的存放地址。

3.數組名可能失去其數據結構內涵

#include <stdio.h>
#include <string.h>

int array_test(char str[]) 
{
    printf("sizeof(str) = %d\n", sizeof(str));
    return 0;
}

int main()
{
    char str[12] = "hello world";
    array_test(str);
    return 0;
}

輸出結果:

sizeof(str) = 8

結論:

(1)數組名作爲函數形參時,在函數體內,其失去了本身的內涵,僅僅只是一個指針

(2)在數組名退化爲指針後,其也失去了常量的特性,可以自增、自減以及被修改

(3)在函數聲明中形參類型char *和char []是等價的。

 

數組和指針的討論先到此結束,如有錯誤還請各位大佬指正,非常感謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章