char* 和char[]的区别

之前在用到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"也是在栈上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值