牛骨文教育服务平台(让学习变的简单)
博文笔记

char *指针的详细解释

创建时间:2015-06-12 投稿人: 浏览次数:4655

前段时间写了一篇char*和char[]的区别,今天对char*做个更深的理解

1:char指针和其他指针一样,也是定义了一块地址,如int*定义了一块栈,4个字节,char*呢,现在写一段代码

#include<iostream>
using namespace std;
int main()
{
	int a=12;
	char b="67";
	int *c=&a;
	char *d=&b;
	return 0;
}

内存分布情况:


我们可以看到,在这种情况下char*表示的意思是简单的字符,这个时候,按照常理,int占用4个字节,char占用一个字节

2:如果用char*代表字符串呢,,上篇文章我大致理解,char*代表字符串存储,它作为一个指针的地址入栈,栈内存储的是指向rodata 区域段的地址,char*字符串的内容存储在rodata段内,c++的内存存储分配上,定义rodata区域是只读区域,规定只读区域存储的数据无法更改,只能读取,按照这个思路,从新写一段代码,验证

#include<iostream>
using namespace std;
int main()
{
	char *p="hello";

	return 0;
}

这里,我需要知道的是p指针的地址,p的值,以及p的值是不是指向一块新的地址

首先查看了p指针栈中的字节数


我查看了&p的地址:他的地址为0x0032faac,它的这块区域存储的值为:48 dd 93 00

按照解释上,p的地址的值是按照栈的存储的,它的值存储的应该是他指向的“hello”的地址才对,但是48 dd 93 00的值代表什么意思,按照栈的入栈顺序,是0x0093dd48这个地址么,是这个地址就是p指向的rodata区域的地址么,这个地址存储着“hello”么。

我试着敲击了0x0093dd48这个栈内存储的地址


发现这个内存地址存储的就是“hello”的ascii码,由于是只读区域的内存,我们试着想一下它的传输机制,以及更改栈或者更改指向地址,或者更改指定地址的内容等等,看是不是错误符合自己的预先的要求,这里就不相信的解释了




声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。