sizeof計算數據類型或變量長度(包括‘\0’),如果計算的變量是一個表達式或函數,只與其最終結果或返回值的類型相關,表達式並不計算,函數也不進行執行。注意計算字符串時計算\0,而strlen不計算\0。
int a[10];
sizeof(a)//計算的就是整個數組的長度,為40; &a,表示取出整個數組的地址,sizeof(&a)=4,sizeof(*&a)=40
其他情況,數組名a均退化為指針。
動態數組的創建和釋放 (1)一維數組: int* arr = new int[n]; delete[] arr; (2)二維數組: int** arr = new int*[row]; for (int i = 0; i < row; i++) { arr[i] = new int[col]; } for (int i = 0; i < row; i++) { delete[] arr[i]; } delete[] arr;
指針數組:int* arr_ptr[5]; 這是一個元素全部是指針的數組
數組指針:int (*arr_ptr)[5]; 這是一個指針,指向了一個數組
以下個人理解,不保證正確:
int arr[5] = { 1,2,3,4,5 };
arr的本質並不是一個地址,而是一個地址加一個大小,表示的是整個數組
輸出arr, &arr, &arr[0]的值是相同的,但是arr本質並不是一個地址,而是一個完整的數組,包含arr[0]的地址和數組的大小,當函數調用的時候arr才從數組退化為指針。
而int (*ptr)=&arr;表示ptr指向了數組arr, (*ptr)[i]=arr[i]。ptr+1指向的是arr[4]后面的地址。
void類型指針,可以儲存任意類型的對象的地址。
指向常量的指針:指針不能改變所指對象的值,但是可以改變所指對象。
const int *p=&a;
指針類型常量:不可改變所指對象
int * const p=&a;
指針型函數,返回值為指針的函數
int* a(){
return int*;
}
指向函數的指針:
int B(double) { return int; }
int (* A)(double);
A a;
a=B;