#include <iostream>
#include<typeinfo>//---------------------类型判断
using namespace std;
void main(){
int a=0;
int c[]={1,2,3,4,5};
char b=' ';
cout<<"c的类型:"<<typeid(c).name()<<'\t'<<"&c的类型:"<<typeid(&c).name()<<endl;//-------------输出类型
cout<<"(&c)[0][2]:"<<(&c)[0][2]<<'\t'<<"(*(&c))[2]:"<<(*(&c))[2]<<endl;//--------注:由于符号结合的优先性,&c和*(&c)都要用括号括起来
cout<<"c:"<<c<<'\t'<<"&c:"<<&c<<'\t'<<"c+1:"<<c+1<<endl;
cout<<"sizeof(char *):"<<sizeof(char*)<<'\t'<<"sizeof(int*):"<<sizeof(int*)<<'\t'<<"sizeof(double*):"<<sizeof(double*)<<endl;
int *ptr1=(int *)(&c+1);//----------对于地址加一是加多少地址,可以先看其类型,然后推知,,,此处即行指针加一变成下一行,然后-1指回上一行的5,所以ptr1[-1]为5
int *ptr2=(int *)((int)c+1);//---c为int*地址,转化int加一之后指向内存中16进制的字节:第二个00(因为整数1在内存中地址从低到高排列为:01 00 00 00)
//将地址转化为int*之后,其取值就是当作int即4个字节来取
cout<<"(int)c:"<<(int)c<<'\t'<<"(int*)(int)c:"<<(int*)(int)c<<'\t'<<"(int)c+1:"<<(int)c+1<<'\t'<<"(int*)((int)c)+1:"<<(int*)((int)c+1)<<endl;
int *w = (c + 1);
cout<<"关于数组C的地址查看:"<<ptr1[-1]<<'\t'<<*ptr2<<'\t'<<(int*)*ptr2<<'\t'<<*w<<endl;//---只有用int*转化为16进制地址才会输出02 00 00 00,
//不然输出的是16进制的10进制整数
int *p=&a;
char *q=&b;
cout<<"&b:"<<&b<<endl;//----c++中遇到字符型指针将其当作字符串输出(相当于数组名,是字符串地址),从而会得到乱码
cout<<"int型地址字节数:"<<sizeof(p)<<" 地址为:"<<p<<endl;//-----------------可以看到p和q都是一个字节,也就
//是地址都是32位,即使你在64位电脑上运行,只要你的编译器是32位,那么指针地址都是32位即4个字节
cout<<"char型地址字节数:"<<sizeof(q)<<'\t'<<" 地址为(int*)q:"<<(int*)q<<endl;//q前面加上这个(int*),就可以正确输出地址
}
总结:1,字符地址不能直接取地址输出,比如:char a=' a';时,如果输出&a就相当于将a当做字符串输出,因为&a相当于char *a
2,地址/指针字节数只和编译器有关
3,指针的类型可以用typeid(变量名).name()输出,作用:1,)决定了加1后地址增加多少字节;2,)决定了用取值运算符时取几个字节;
4,
int c[]={1,2,3,4,5};
int *ptr2=(int *)((int)c+1);
cout<<*ptr2<<'\t'<<(int*)*ptr2<<endl;
直接输出*ptr2不会输出02000000,只有将其用(int*)强制类型转化之后才会输出02000000,前者相当于输出十进制,转化后才会输出16进制,即输出地址
5,一个变量用了&取址之后,该变量类型就会变成原来该变量声明的基础上,将变量名改为(*)的类型,例如char a;中变量a用&之后“&a”的类型就是char *,,如果是char a[2];,则&a的类型就是char(*)[2],相当于行指针了