關於指針和sizeof學習的一些總結

   前段時間主要學習了一些關於指針方面的知識,結合以前碰到的一些問題,在這裏總結一下,便於以後進行快捷的學習。
    1)關於int * const  a(此處沒給a初始化值所以有錯誤);和 int const * a;的區別:
    前面一個學名叫指針常量,表示整形指針a指向固定的地址,不能對a的值進行加減、賦值操作。但是可以對整形指針a的解引用(*a)進行賦值等操作;
    後面一個學名叫常量指針,表示整形指針a的解引用(*a)不能進行賦值,而a的值卻可以改變。
   2)關於int *p[3]和int(*p)[3]的區別:
   前面一個是一個指針數組,它表示p是一個含有三個"數"的數組,每個"數"表示一個指向整型數的指針(用法:p[0]=&a);
   後面一個則是一個指針,它表示指針p是一個指向含有三個數的數組(用法:int a[3];
int (*p)[3];p=a;)。
   與此類似的還有:int *f();表示一個函數返回值爲int *型;int (*p)f();表示一個指向函數的指針。
   3)關於sizeof和數組、指針的關係:
   首先強調一下sizeof不是一個函數,而是一個計算長度的操作符,其對長度計算是在編譯階段而不是在運行階段

int a[10]={0};int *p=a;
sizeof(a)=40;而sizeof(p)=4;
對於數組sizeof計算的是整個數組所佔有的內存空間大小(單位爲字節),所以其大小爲40,而對於指針p,sizeof計算的是它本身所佔有的空間的大小也就是4(因爲對於32位機器不管對於任何類型的指針大小都爲4

不管數組是否爲空,sizeof計算的都是該數組總的大小,對於字符數組strlen計算的是裏面所存儲的字符的數量(不包括最後的'\0')。如下例所示:char a[]="abc";sizeof(a)=4;     char a[10]="abc";sizeof(a)=10;    char a[10]="abc";strlen(a)=3;

對於動態分配的數組double *a=new double[10];sizeof(a)=4;這說明進一步說明sizeof對長度計算是在編譯階段而不是在運行階段。

關於幾個訪問內存越界或者訪問已回收內存的討論:
一個是:
        int a[10]={0};
int *p=a;
p+=11;
cout<<*p<<endl;
這個得到數組後面內存的數據而vc++6.0不會報錯;
一個是
int *fun(int x)
{
        int *a=&x;
return a;
}
int main()
{
int a=10;
int *b=fun(a);
cout<<*b<<endl;
return 0;
}
因爲子函數運行時分配了一個空間,當它運行完後就會收回x所佔有的內存區,所以主函數還是可以訪問該區,不過值不確定了。
還有一個是:
int *fun(int x)
{
int *b=new int[10];
b[0]=10;
//delete []b;
return b;
}
int main()
{
int *b=fun(a);
cout<<*b<<endl;
return 0;
}
只要不delete主函數還是會得到值,所以在這兒如果循環夠大可以使內存區溢出,而在delete後值也不確定了。


好吧這就是這段時間學到的  以後需要補充的繼續補充
   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章