int a = 7;
//a的引用,就是一个别名
int &reference = a;
//a的指针
int *point_a = &a;
//指针point_a的指针,一个二维指针
int **point_point_a=&point_a;
int b[] = {1, 2};
//数组b的指针,指向第一个元素
int *point_b = b;
内存块中只有 0x????(地址值) 和 ?(数值)这两种情况,里面是地址值就是指针变量,里面是数值就是普通变量
每一个变量都有类型,比如int变量,double变量,int指针变量,int指针的指针变量
以后说指针脑子想到的是里面是个地址值,二维指针也是,其实java也有指针(Student s=new Student((),这个s里面存着就是地址值)
&用在哪个内存块就出来一个这个内存块的地址值(唯独用在数组名字这种int *出来的地址值不是这样)
- b[0]是int,内存里面存着一个数值
- b和&b[0](同一个东西)是int *,内存里面存着一个地址值,指向数组第一个数值
- &b是int (*)[2],内存里面存着一个地址值(值跟b相同),代表一个长度为2的int数组(因为不是指针无法前面加*无法取到指向的东西)
- b+1/&b[0]+1(&b[0]是0x61fe00,那么&b[0]+1就是0x61fe04)
- &b+1跳过整个数组(&b是0x61fe00,那么&b+1是0x61fe14)
*(&b):这种地址值前面加个*,cout出来还是地址值,而*b和*(&b[0])会正常cout出他们指向的内容
*(int *)(&b):强行转化为一个int *,这样值不变,前面加*就可以访问到它指向的数组第一个数值了
int c[2][3] = {1, 2, 3, 4, 5, 6};
补充一个二维的
- c[0][0]是int,内存里面存着一个数值
- c[0]是int *,内存里面存着一个地址值,指向{1,2,3}(c[0]与c值相同)
- c是int (*)[3],内存里面存着一个地址值(值和c[0]相同),代表一个长度为3的int数组
- &c是int (*)[2][3],内存里面存着一个地址值(值和c[0]相同),代表一个长2宽3的int二维数组
个人总结笔记,可能有错误
部分参考至:https://blog.csdn.net/wang13342322203/article/details/85228415