之前在用到char*和char[],用到srtncat,让char[]对char*进行添加时运行会崩溃,之后做了一些分析和练习,对char*和char[]有了更深的理解。下面附上一些测试数据。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char *p = "aabbcc";
char q[] = "AABBCC";
cout<<"p:"<<p<<endl;//aabbcc
cout<<"q:"<<q<<endl;//AABBCC
cout<<endl;
cout<<"*p:"<<*p<<endl;//a
cout<<"*q:"<<*q<<endl;//A
cout<<endl;
cout<<"&P:"<<&p<<endl;//0012FF44 栈上
cout<<"&q:"<<&q<<endl;//0012FF3C 栈上
cout<<endl;
printf("P:%d\n", p); //4653132 == 0X0047004C 字符常量区上
printf("q:%d\n\n", q);//1244988 == 0x0012FF3C 栈上
/*
char *类型的字符串:
指针存放在栈上,而右值存放在字符常量区,指针指向在常量区的字符串字面值。
所以在试图改变字符串字面值的时候,会报错或者程序崩溃。
!!!注意:是改变字符串字面值,而不是改变指针的地址!!!
例如:strcat或者strcpy的操作中,strcat(char *, char*),strcpy(char*, char *)
将char* 类型的字符串放在第一个位置
即要求被改变(添加和修改)的位置上时会报错
*/
cout<<"//"<<endl;
int * ip = new int;
int ip2[] = {1,2,3};
cout<<ip<<endl; //0X00530798 堆上
cout<<*ip<<endl;//-842150451
cout<<&ip<<endl<<endl;//0X0012FF38 栈上
cout<<ip2<<endl;//0X12FF2C 栈上
cout<<*ip2<<endl;//1
cout<<&ip2<<endl<<endl;//0X0012FF2C 栈上
double * pp = new double;
double pp2[] = {1.1, 2.0, 3.0};
cout<<"pp:"<<pp<<endl; // 0x00610818 堆上w
cout<<"*pp:"<<*pp<<endl;//-6.27744e+066
cout<<"&pp:"<<&pp<<endl;//0x0012FF28 栈上
cout<<endl;
cout<<"pp2:"<<pp2<<endl;//0X0012FF10 栈上
cout<<"*pp2:"<<*pp2<<endl;//1.1
cout<<"&pp2:"<<&pp2<<endl;//0X0012FF10 栈上
cout<<"//"<<endl;
char *p2 = "ABC";
char p3[] = "CBAcba";
printf("p2:%d\n",p2); //4653148 == 0x0047005C 常量区
cout<<"p2:"<<p2<<endl;// ABC 指向常量区
cout<<"*p2:"<<*p2<<endl;//A
cout<<"&p2:"<<&p2<<endl;//0x0012FF0C 栈上
cout<<endl;
printf("p3:%d\n",p3);//1244932 == 0X0012FF04 栈上
cout<<"p3:"<<p3<<endl;//CBAcba 栈上
cout<<"*p3:"<<*p3<<endl;// C
cout<<"&p3:"<<&p3<<endl;//0X0012FF04 栈上
cout<<endl;
p2 = p3;
printf("p2:%d\n",p2);//1244932 == 0X0012FF04 栈上
cout<<"p2:"<<p2<<endl;// CBAcba
cout<<"*p2:"<<*p2<<endl;//C
cout<<"&p2:"<<&p2<<endl;//0x0012FF0C 栈上
cout<<endl;
printf("p3:%d\n",p3);//1244932 == 0X0012FF04 栈上
cout<<"p3:"<<p3<<endl;//CBAcba
cout<<"*p3:"<<*p3<<endl;// C
cout<<"&p3:"<<&p3<<endl;//0X0012FF04 栈上
cout<<p2<<endl;//CBAcba
return 0;
}
其实到后来发现时自己对c++内存分配的理解不够彻底。
char*p = “abc"; p在栈上,p指向 "abc", 而"abc"实在字符常量区上,是一个字符串字面值;
而char p1 []= "aabbcc",p1是在栈上,而"aabbcc"也是在栈上。