指针 地址的思考

#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],相当于行指针了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值