sizeof,数组,指针
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;