首先我们只知道一个变量的大小和地址的分配是从定义开始的,初始化和赋值是将内容写入这个地址。关于引用,指针的区别我们参考下面这个图
int main()
{
int a;
int *a0;
int *a1 = new int;
a1 = &a;
int &a2 = a;
int &a3 = *a1;
cout << a << "\n" << &a <<"\n" << endl;
cout <<a0 << "\n" <<&a0 << "\n" << endl;
cout << *a1 << "\n" << a1 << "\n" << &a2<< "\n" << endl;
cout << a2 << "\n" << &a2 << "\n" << endl;
cout << a3 << "\n" << &a3 << "\n" << endl;
}
多级指针其实也是一样的道理
int a;
int *a0;
int *a1 = new int;
a1 = &a;
int &a2 = a;
int &a3 = *a1;
int **a4=new int *;
*a4 =a1;//要一个指针一个指针的解析
cout << a << "\n" << &a <<"\n" << endl;
cout <<a0 << "\n" <<&a0 << "\n" << endl;
cout << *a1 << "\n" << a1 << "\n" << &a1<< "\n" << endl;
cout << a2 << "\n" << &a2 << "\n" << endl;
cout << a3 << "\n" << &a3 << "\n" << endl;
cout << **a4 << "\n" << *a4 << "\n" << "\n" <<a4<< "\n" << &a4 << endl;
}
你是否看过大名鼎鼎的烫烫烫和屯屯屯呢?
这两个分别对应没有初始化的栈字符和堆字符。因为C++“<<”的时候把字符地址输出为字符,而字符数组是没有结束符号"\0"的,所以导致占用了后面的内存地址倒置“神志不清”
如果需要查看字符和字符串的地址,我们可以使用下面的方法
int main()
{
char a='s';
char *b=new char;
printf_s("%p\n", &a);
//printf_s("%p\n", b);
cout << static_cast<void *>(b) << endl;
//cout << static_cast<void *>(&a) << endl;
}
其次我们要注意字符数组和字符串指针其实是可以转换的,字符串的地址和数组的地址一样,等于首字符字符的地址。也就是 **=[][];*=[];
int main()
{
char ***a = new char**;//初始一个二级字符指针
char b[2][2][2] = {'a','b','c','d','e','f','g','h'};
**a = **b;//这里相当于new char
const char *c = "abcdef";//字符串常量
cout << **b << endl;//指向*b的地址取数据,等价b[0][1]
cout << *b << endl;//指向b的地址取数据,等价b[][]全部内容
cout << b << endl;//其实是b[0][1]的地址
cout << &b<< endl;//整个b的地址,从b[0][1]开始
cout << **a << endl; //=**b
cout << *a << endl;//=*b
cout << a << endl;//这里不必同于b,因为char *a已经确定了a的地址
cout << &a << endl;//a本身地址
cout << *c << endl;//指向c第一个字符地址
cout << c << endl;//取值
cout << &c << endl;//c本身地址
}