作者:雪染苍原牛仔 | 来源:互联网 | 2023-10-09 20:05
我被string,char,char*,char[],弄到思维乱七八糟了,望各位大大帮我整理下思维--!chara[]abc;自动分配4个内存(包含0)的字符串数
我被string,char,char*,char[],弄到思维乱七八糟了,望各位大大帮我整理下思维- -!
char a[] = "abc";//自动分配4个内存(包含'/0')的字符串数组;
char *cpa = a;//指向数组a的首地址
【问题1:cpa指针已经分配空间给他了?没有new空间给他哦?】
char *cpb = new char[100];//为cpb分配100个字符大小的空间
cpb = a; //把cpb指向数组a的首地址
【问题2:这种方法和上面的方法有什么区别啊?是不是这里分配了100个字符大小的空间给指针,但指针每次指向一个字符,所以是在浪费空间?】
cout<
【问题3:我知道*cpb是输出当前指针所指向地址的值'a',但输出cpb指针的结果是整个字符串abc,cpb是一个字符指针,指向一个字符串,怎么会输出整个字符串而不是一个字符呢?难道系统自动做了遍历?】
char *cpc = "def";//cpc指针指向字符串首地址
【问题4:和问题1类似,这指针已经分配空间给他了?】
string b;
b = cpc;
【问题5:估计这个关于STL里面的string,用sring 定义了一个字符串常量b(而非指针)怎么可以把一个字符指针cpc赋值给字符串常量b的?】
【问题6: char *p = "abc" 对比 char e[] = "abc"; char *p = e;的区别】
个人猜想: 前者没为字符串申请空间,所以不能改动指针所指向的值,而后者所分配的空间则为4个字符大小的空间,所以只能删减字符而不能增加字符。
最后一个问题- -!!这就是实际操作中遇到的问题。
const char *a = 【调用一个函数,其返回值为("const char *x")】; //获取一段字符串
编译没错,但调试跟踪数据时,却说“错误的指针”,后来发现是因为指针a没有初始化和分配内存空间。
我随便写了个简单的相似的例子
const char *m = "poi";
const char *n = m;
cout< 为什么这样子又不用申请空间就直接可以运行呢?
我思路很乱,问题很多,望各位热心人士帮忙解答
13 个解决方案
char a[] = "abc";//自动分配4个内存(包含'/0')的字符串数组;
char *cpa = a;//指向数组a的首地址
【问题1:cpa指针已经分配空间给他了?没有new空间给他哦?】
答:指针一定要分配空间才能用吗?不是。难道是老谭的书这么说的吗?怎么这么多人有这个想法。
只要用有效的指针来初始化或者赋值给他后就可以访问。char*cpa = a;//这句的意思是用数组a的首元素的指针来初始化cpa;
char *cpc = "def";//cpc指针指向字符串首地址
【问题4:和问题1类似,这指针已经分配空间给他了?】
应该写成
const char *cpc = "def"; //没有分配空间, cpc 指向了字符串常量
算了不说了,楼主看C++PRIMER吧,不要看哪些乱七八糟的书。否则像这种莫明奇妙的问题只会不断的冒出来。。
const char *m = "poi"; // 没有分配空间,指向了字符串常量
const char *n = m; // 没有分配空间,指向了字符串常量
cout<
那只是指针指向某一个地址,并没有真正的为指针分配内存空间
首先你要彻底忘掉要给指针分配空间这件事再看下面的内容。
指针作为一个普通的对象。他的内存管理和普通对象一模一样,不用额外的分配空间给他。
指针可以指向一个与指针类型相应的类型的对象,而他的值就是这个对象地址。
访问一个并不是指向一个有效对象的指针是不合法的。//通过赋值或初始化使指针指向一个有效的对象。
const char*p; 代表p指向的对象是 const char类型。所以指向的对象不可以被更改。
char* 类型可以转换成 const char*,反之不。
数组名可以转换成其首元素的指针:
const char *m = "poi";//“poi”是一个匿名的字符类型数组,可以转化成其首元素的指针。。
详见4楼链接的大神讲解。
new的作用是在堆内存中获得内存,并构造一个匿名的左值对象,并返回他的指针。
给指针赋值或初始化的不一定是new,可以是任何相应的类型的表达式。所以完全不存在分配内存一说。