C++基础之字符串与指针

来源:互联网 发布:算法的乐趣 epub 编辑:程序博客网 时间:2024/05/29 18:34

一、字符串

1、字符串默认用字符数组来存储。

2、strlen求字符串长度是不包括\0的

3、

char a[]={“Hello World!”};或  char a[]=”Hello World!”    //  ’\0’由计算机自动加上。
char c3[3][5]={{ 'a','b','c','d','\0'},{'m','n','p','\0'},{'x','y','z','\0'}};//需要自己加上\0char c3[3][5]={"abcd", "mnp", "xyz" };//不需要自己加\0char c3[ ][5]= { "abcd","mnp","xyz" };  这三种方法都是等价的。
4、

• 从键盘读入一个字符串   cin >> string1 ;   当从输入流中读入一个字符串时, 将读入以空白字符分隔的字符串。   如当用户键入 Harry Borter时, 只有Harry读入到name。• 为了完整输入用户信息, 可以使用getline函数。   getline(cin,name);   读入回车之前的所有字符,并将所读入的字符串存储到变量name中。

二、字符串常见错误:

1>以下程序是错误的,常量字符串的地址所指向的内容是不容许发生改变的。(并且name数组中每个字符串的长度也为0)

char *name[]={“”,””,””,””};for(int i=0;i<4;i++){cin>>name[i];}

以上例本质错误是没有打开字符串数组缓冲区
2>错误,常量字符串的地址所指向的内容是不容许发生改变的。
char *name[]={“AAAAA”,”BBBBB”,”CCCCC”,”DDDDD”};for(int i=0;i<4;i++){cin>>name[i];}
3>正确
char *Name[6];for(int i=0;i<6;i++){name[i]=(char*)calloc(256,sizeof(char));}或者:char name[256][256];
本例子打开了缓冲区。

三、字符串说明

1、

除了char型的数组cout<<数组名 输出内容
其他的类型数组cout<<数组名  输出地址

char chartest[256] = "asdhfjka";int inttest[256] = { 1, 2, 3, 4, 5, 6 };cout << chartest << endl;        //字符串:asdhfjkacout << inttest;                 //地址:00B3F1EC

2、

char *Example[] = { "tgqaertg", "sadgf", "fg","ggg" };
这里,Example是指针数组。


3、举例

//--------------定义------------ --------------------int count0[4] = { 0 };int count1[4] = { 1 };int count2[4] = { 2 };int count3[4] = { 3 };char *name[] = { "Aaa", "Bbb", "Ccc","Ddd"};char *p; p = name[0];int *count[4] = { count0, count1, count2, count3 };int *pp; pp = count[0];//--------- ---------------------- -----------------//count为指针数组,该数组中的每一个元素都是一个指向整型元素的指针。

cout << &count << endl;//count的地址  004FF86Ccout << count << endl;//count的内容(指针类型的变量,它的值(内容)为地址)   004FF86Ccout << &count[0] << endl; //count[0]的地址  004FF86C  cout << &count[1] << endl;//004FF870cout << *count << endl;//count所指向地址处的内容(count0)004FF8CC        cout << count0 << endl;//count0所指向地址处的内容004FF8CCcout << count[0] << endl;// 004FF8CCcout << count[1] << endl;// 004FF8B4cout << pp << endl;//004FF8CCcout << *count[0] << endl;//0======= ===================== ================ =====        cout << &name << endl;//name的地址  00BCFC74cout << name << endl;//name的内容   00BCFC74cout << &name[0] << endl; //name[0]的地址  00BCFC74  cout << &name[1] << endl;//00BCFC78cout << *name << endl;//name所指向地址处的内容 Aaacout << name[0] << endl;// Aaacout << name[1] << endl;// Bbbcout << p<< endl;//Aaacout << *name[0] << endl;//A

四、指针

1、一般的C++编译系统为每一个指针分配4个字节的存储单元

2、

string kk = "asdgasg";  cout<<kk;
char *ff= "asdgasg"; cout<<ff;
char dd[8] = "asdgasg"; cout<<dd;
以上均输出asdgasg

3、常量指针:指针所指向的是一个常量,指针指向的内容不能变。
      指针常量:指针是常量,指针指向的内容可以变,但是指针的指向不能变

4、函数名是常量地址,指向程序区。

5、函数指针:指向函数的指针
     指针函数:返回指针值的函数
6、

int(*a)[3];//数组指针

int *a[3];//指针数组

五、指针常见错误:

使用堆内存,涉及内存回收问题。

注意一般函数不return指针类型,常出错(可以return整型、char型、string型)

1>int *a(int x,int y)             //错误  {    int *z=NULL;    int c=x+y;*z=c;    return z;//因为c为局部变量,c的生命周期仅为距离它最近的这个大括号内,当a函数结            //束,c即释放。c释放后,z指向的内容就不确定了。  }  void main()  {    int * p=a(19,20)//这里*p的值是未知的    cout<<*p;  }
2>int *a(int x,int y)             //对,但是风险大,容易忘记free,导致内存泄漏  {    int *z;    z=(int *)alloc(sizeof(int));    *z=x+y;    return z;  }  void main()  {    int * p=a(19,20)    cout<<*p;    free(*p);   }
3>void a(int x,int y,int *res)     //正确,(安全)建议使用  {    *res=x+y;  }  void main()  {    int res;    a(23,34,&res);  }或者:    void main()  {    int *res;    res=(int *)alloc(sizeof(int));    a(23,34,&res);    cout<<*res;    free(*res);   }

六、指针说明

1>定义了256个指针(每个指针所指向的字符串长度无限制)
char *str[256]={“1,2,3,4,5,6” , ”7,8,9,10,11,12”};
                        占12个字节       占12个字节
所占内存大小:12*2+256*4(数据的字节数+指针的字节数)

2>定义了指针(2个指针)
char stemp[ ][256]={“1,2,3,4,5,6”,”7,8,9,10,11,12”};
指针所指向的数据类型为char  [256]  (即指针所指向的字符串长度最多为256个)
所占内存大小为256*2+4*2(数据的字节数+指针的字节数)

3>引用与取地址:
&前有类型符,就是引用,否则就是取地址。
int  &b=a;//声明b是a的引用


原创粉丝点击