c ++關於指針的一些理解

  1. 指針與引用的區別
  • 非空,任何情況下都不能使用指向空值的引用,一個引用必須指向某個對象,不存在指向空值的引用。
    -合法性,在使用引用之前,不需要測試他的合法性。指針總是被測試,以防止爲空。
    下面使用指針和引用實現兩個數的交換

void swap(int *p,int *q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
引用
void swap(int &p,int &q)
{
int temp;
temp=p;p=q;q=temp;
}


  1. 全局指針與局部指針

    char c[]=“hello world”
    分配的是一個局部數組,對應的是程序中的棧,字符串常量保存在只讀的數據段,同一變量名對應的是不同的地址。
    char ^*c=“hello world”
    全局變量,對應的是內存裏面的全局區域,字符串常量保存在保存在普通數據段,同意變量名對應的地址是一致的


  1. 函數指針

函數指針是指向函數的指針變量。 因此“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這裏是指向函數。如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量後,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。函數指針有兩個用途:調用函數和做函數的參數。

void(f)()^*f)()就是一個指向函數的指針
voidf()^*f()就是一個返回值是一個指針
const intint ^*就是一個const 指針
int ^*const 是一個指向const的指針從
const int ^*const 一個指向const 的const 指針。
下面是一個例子,可以幫助理解:
#include<stdio.h>
int max(int x,int y){return (x>y? x:y);}
int main()
{
int (*ptr)(int, int);
int a, b, c;
ptr = max;
scanf("%d%d", &a, &b);
c = (*ptr)(a,b);
printf(“a=%d, b=%d, max=%d”, a, b, c);
return 0;
}


  1. 指針數組與數組指針
  • 指針數組

    指針數組就是一個數組,數組的每個元素都是一個指針
    例如
    inta[10]int ^ *a[10]就是一個數組,每個元素都是一個指針,那麼就有10個指針存在這個數組裏面。

  • 數組指針

    數組指針,就是一個指向數組的指針,可以聲明一個指針,int(a)[10]int (^* a)[10] 同時可以申a=&b表明a指向b數組。一般的將a 賦值給誰,我們就之間用這個值替換a就可以得到最終的值
    例如

    int main(){
    int test[2][3]={{1,2,3},{4,5,6}};
    int test2[3]={1,2,3};
    int(A)[3]=int (^*A)[3]=&test[1]test[1]
    B=&test2;
    cout<<(A)[0](^*A)[0]<<endl’;//直接用test[1]替換(A)(^*A),就是4
    }

  • c++有了malloc/free,爲什麼還要new/delete

前者是標準庫函數,後者是c++運算符,都是爲了申請和釋放內存
對於非內部數據類型的對象來說,malloc沒有辦法滿足動態對象的需求,對象創建的同時要執行構造函數,對象在消亡前要自動執行析構函數,有malloc是庫函數而不是運算符,不在編譯器的控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc、free
因此c++需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理和釋放內存工作的運算符delete,不是庫函數,而是運算符。

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