关于C++的char * 内存解析

#include <iostream> 
using namespace std;
int main() {

	char* a = (char *)"hello";
    cout << a[0] << endl;
    //取出a存储地址中的值,打印出“h”
	cout << &a[0] << endl;
    
	return 0;

}

打印结果:

   

关于类型:

a的类型是char**,由于运算符优先级的关系,会先运行a[0](char)类型,然后进行取址的操作 所以&a[0]的类型是char*

关于内存地址(64位系统,内存地址相邻4个字节):

<地址1>  (a)[       地址2         ]

<地址2>           [  前5个字节存储hello每个字符的ASCII码 ]

 0x0000007780cff628 {0x00007ff66cf9ce04 "hello"}表示0x0000007780cff628是&a的值,0x00007ff66cf9ce04是0x0000007780cff628地址存储的值,把0x00007ff66cf9ce04地址所储存的值取出来是“hello”字符串

cout对于char*类型作了重载。
表面上看是把一个字符指针传给了cout,实际上cout会找到&a[1]指向的那块内存,把那里保存的字符依次输出,直到遇见字符串结束符'\0',所以当cout接收到&a[1]的时候,会定位到a[1]字符所在的地址,把后面剩下的字符一起打印出来。

参考链接:

https://bbs.csdn.net/topics/310127209

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值