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的引用
阅读全文
0 0
- C语言基础-指针与字符串19
- C语言基础之数组、字符串、指针
- C++基础之字符串与指针
- c学习之指针与字符串
- C语言之字符串与指针
- C语言之字符串与指针
- c语言基础之指针与函数
- C语言基础之指针与数组
- C语言基础与提高之指针
- C指针与字符串
- C语言编程基础-13字符串操作与指针数组
- C语言基础学习之指针操作字符串反转
- C基础之指针
- C语言之指针与字符串的相关操作
- C语言:字符串与指针
- c语言字符串与指针
- C/C++ 字符串与指针
- c语言基础之指针与一维数组
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本新增新的角色授权管理界面效率更高、更规范
- 橙色预警:Oracle游标泄露(open_cursor耗尽)
- Linux中Cron任务间隔执行:每隔几分钟/几小时/几天
- WEB应用的Session冲突
- java学习笔记:进制
- C++基础之字符串与指针
- 1025. PAT Ranking (25)
- 【二分+RMQ】玲珑oj 1149
- SVN常用命令
- 筛法快速求解素数
- 用matlab在图像上画矩形框,并保存坐标到文本中
- Codeforces Round 833A-The Meaningless Game
- ios-饼图和柱状图的绘制
- 多线程之初理解