当年这里没学好,现在需要反反复复搞,未完待补充。
指针
// int* ptr = arr; 等价于 int*ptr = &arr[0];
// int ar[] = &arr[1]; 将arr[1]的地址,赋值给ar[],即 &ar[0] = &arr[1], ar[]以arr[1]为首地址
void fun(int* ptr, int ar[], int val){
*ptr = 3; // ptr为指针,指向arr首地址,改变ptr所指地址保存的值,就改变了arr[0] = 3
*ar = 3; // *ar为取ar[0]地址保存的值,并改为3,
val = 3; // 改变形参的值,对实参无影响
}
int main(){
int arr[3]={1,2};
fun(arr, &arr[1], arr[2]);
printf("%d%d%d",arr[0],arr[1],arr[2]);
} // 输出 3 3 0int arr[]={6,12,8,9,10};
int * ptr;
ptr=arr; // ptr指向arr首地址 arr[0]
//Eg1
cout<<*(ptr+2); // 8 // 选择ptr指针所指地址后面2单元的地址,即arr[2],再取其值 8
*(ptr+2)+=2; // 更改 ptr指针所指地址后面2单元的地址 所存元素的值,再改变此值 8+2
printf("%d,%d ",*ptr,*(ptr+2)); // 6 10 // ptr本身的指向没变,仍指向arr[0]
//Eg2
cout<<*(ptr++)<<endl; // 6 // 先取ptr所指地址保存的值6,再将ptr指针后移两单元,指向arr[1]
cout<<*ptr<<endl; // 12 // 上一行已经改变了ptr的指向,取其值:12
*(ptr+2)+=2; // 更改 ptr指针所指地址后面2单元的地址 所存元素的值,再改变此值9+2
printf("%d,%d ",*ptr,*(ptr+2)); // 12 11
// 初始ptr指向arr[0],在第9行移动后指向arr[1],ptr在11行指向不动--arr[1],只更改了arr[3]的值指针和引用区别?
指针 | 引用 |
指针是具体变量,需要占用存储空间。 | 引用只是别名,不占用具体存储空间,只有声明没有定义; |
sizeof()是指针的大小,=4 | sizeof() 是被引用对象的大小 |
指针声明和定义可以分开,可以先只声明指针变量而不初始化,等用到时再指向具体变量。可以被初始化为NULL | 引用在声明时必须初始化为另一变量,必须有具体实体; |
指针变量可以重新指向别的变量。 | 引用一旦初始化之后就不可以再改变(变量可以被引用为多次,但引用只能作为一个变量引用); |
作为参数传递,指针需要被解引用才可以对对象进行操作 | 作为参数传递,直接对引用的修改会改变引用所指向的对象 |
有const指针,指针可以有多级 | 没有const引用,且引用只有一级 |
使用++运算符的意义不一样 | |
返回动态内存分配的对象or内存,必须使用指针 | 若使用引用,可能引起内存泄漏 |
区别以下指针类型?
int *p[10]
int (*p)[10]
int *p(int)
int (*p)(int)- int *p[10]表示指针数组,强调数组概念,是一个数组变量,数组大小为10,数组内每个元素都是指向int类型的指针变量。
- int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向的是一个int类型的数组,这个数组大小是10。
- int *p(int)是函数声明,函数名是p,参数是int类型的,返回值是int *类型的。
- 可理解为 int* p (int) →→ type p (int)
- int (*p)(int)是函数指针,强调是指针,该指针指向的函数具有int类型参数,并且返回值是int类型的。
- *p是一体的,是个指针
常量指针和指针常量区别?
- 常量指针是一个指针,读成常量的指针,指向一个只读变量。如int const *p或const int *p。
- 指针常量是一个不能给改变指向的指针。如int *const p。
数组名和指针(这里为指向数组首元素的指针)区别?
- 二者均可通过增减偏移量来访问数组中的元素。
- 数组名不是真正意义上的指针,可以理解为常指针,所以数组名没有自增、自减等操作。
- 当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作,但sizeof运算符不能再得到原数组的大小了。
野指针是什么?
向一个已删除对象or未申请访问受限内存区域的指针
- 也叫空悬指针,不是指向null的指针,是指向垃圾内存的指针。
- 产生原因及解决办法:
- 指针变量未及时初始化 => 定义指针变量及时初始化,要么置空。
- 指针free或delete之后没有及时置空 => 释放操作后立即置空。