优化网站专题/东莞网站制作公司联系方式
指针相关概念
指针既是内存地址,指针和内存地址有关系;
什么是内存地址?
1、内存是以字节为单位的连续存储介质
2、内存的地址具有唯一性、和不可修改性
3、内存是一维数组的存储模式
空指针
在内存模块组中,有一个起始地址,也就是0号对应位置的内存块中,这里就是NULL PONITER的内存地址;
把数据指到这个地址,系统会自动进行回收。
野指针
当一个指针没有明确指向一个内存地址的时候,称为野指针;比如int* p
;
当定义一个指针的时候需要直接进行初始化int* p = nullptr;
C语言的指针运算符 ‘*’ ‘&’
‘*’运算符用于定义一个指针类型,我们说的指针都是有类型的,int* p = nullptrt;
这里是int类型的指针,
定义指针
int main(int argc, char* argv[])
{int x = 3, y = 4;int* p1 = &x, *p2 = &y;
}
内存结构解析
int x = 3, y = 4;
这句代码的时候,内存分配了8bits,里面分别存放了x和y;
int* p1 = &x, *p2 = &y;
这句代码的时候,内存也是分配了8bits,里面存放的是x和y的内存地址
解指针
当我们使用指针指向一个数据的时候,操作数据的时候使用指针,如果想使用数据本体,需要解指针
int main(int argc, char* argv[])
{int x = 3, y = 4;// '&'作用在变量的时候是取地址,作用在类型的时候表示引用int* p1 = &x, *p2 = &y;// 定义好的指针,再次使用‘*’既可以解指针cout << "x:" << *p1 << " y:" << *p2 << endl;
}
取数据地址‘&’
int main(int argc, char* argv[])
{int x = 3, y = 4;// '&'作用在变量的时候是取地址,作用在类型的时候表示引用int* p1 = &x, *p2 = &y;// 定义好的指针,再次使用‘*’既可以解指针cout << "x:" << *p1 << " y:" << *p2 << endl;// '&'这里是别名,等同于x1和x是一个数据int &x1 = x;x1 = 5;cout << "x:" << *p1 << " y:" << *p2 << endl;
}
一维数据指针
数组指针的一些基本概念
1、一维数据的数组名既是内存的首地址
2、数组指针是连续的,一定是连续的
int main(int argc, char* argv[])
{int arr[] { 3, 4, 5, 6, 7};// 一维数组的首地址既是内存块的起始位// 当p0++的时候,内存会进行偏移,每次增加1个数,内存会偏移4bits,因为这是一个int类型的指针int* p0 = arr;// 有两种访问数组的方法,下标法和指针法int v1 = arr[1];int v2 = *(p0 + 1);cout << (v1 == v2) << endl;
}
二维数据指针
多维数组在内存的存储还是一维数据的方式,通过展开多维数据,呈现为一维数据的方式
int main(int argc, char* argv[])
{// 二维数组的展开方式是先rows行,后列cols// 这里是一个2行3列的二维数组,数组名是第一行的首地址int arr[][3] = {{ 2, 3, 4 }, { 5, 6, 7 }};// 访问方式:下标法和指针法// 下标法int v1 = arr[1][1];// 指针法// arr数组名表示第一行的首地址,总共2行// arr[1]第二行的首地址,然后偏移1个单位,等同于arr[1][1]int v2 = *(arr[1] + 1);cout << (v1 == v2) << endl;
}
二级指针和指针函数
多级指针概念:一个指向指针的指针,一个指针在内存里面存储了另外一个指针的地址,多级指针需要多次解指针
指针函数:用指针来定义的函数,函数不确定,指针函数是一种C/C++的回调函数
代码实例
int Pointer(int x, int y)
{return x + y;
}int main(int argc, char* argv[])
{// ------- 二级指针 --------int x = 3, y = 4;int* p1 = &x; // p1 是一个一级指针,指针直接指向x的内存地址int** p2 = &p1;// p2 是一个二级指针,指向p1存储的内存地址cout << p2 << endl; // p2的内存地址cout << *p2 << endl; // p1的内存地址cout<< **p2 << endl; // x真实的数据// ------- 指针函数 ---------int (*PointerFuncNormal)(int, int); // 通用指针函数定义,语法:returnType (*funcName)(inType...)using PointerFuncUsing = int(*)(int, int); // C++2.0之后使用using简化的定义,语法:using funcTypeName = returnType(*)(inType1...)PointerFuncNormal = Pointer;int normal = PointerFuncNormal(3, 4);PointerFuncUsing pointer = Pointer;int usingi = pointer(3, 4);cout << "normal:" << normal << " using:" << usingi << endl;
}
指针常识
1、指针一般和一个类型并存在,int* p=nullptr
;本来是一个int
类型,指针加入以后变成了int*
类型
2、指针函数不会跟随类型并存在,int (*Func)()
,(*Func)
强制指针作用到函数上