指针与字符串
来源:互联网 发布:历史数据库 编辑:程序博客网 时间:2024/05/20 14:20
1.先来看一个程序:
char flower[10] = "roses"; //数组char *s = "red"; //从这里看出"red"实际是一个地址,并将地址赋给了指针scout << flower << " are "<<s;//" are "作为字符串常量
运行结果:
cout对象一个是数组名flower,一个是字符串常量“s are red”
首先需要知道的是数组名是一个指向字符串第一个字符的地址,因此flower是包含字符r的char元素的地址,cout对象是flower,就选择打印该地址处的字符,并且继续打印,知道遇到空字符(\0);
同一个cout对对象处理的应该是一样的,因此字符串常量也应当是一个地址,并且是第一个元素s的地址;
现在有一个指向char类型的指针s,那当指针作为cout对象时,也是用同样的处理方法;
char animal[20] = "bear"; char *ps; cin >> animal; ps = animal; //animal赋值给ps的是地址而不是字符串,所以这两个指针指向了相同的地址 cout << ps<<endl; cout << animal << (int*)animal << endl; cout << ps << (int*)ps << endl; ps = new char[strlen(animal) + 1]; //创建一个副本,让ps指向新的地址 strcpy_s(ps,strlen(animal)+1, animal); cout << animal << (int*)animal << endl; cout << ps << (int*)ps << endl; delete[]ps;
运行结果:
cout对象时指针,原本应该打印地址,但当指针类型是char时,将打印指针指向的字符串。此时如果想要显示字符串的地址,需要进行强制类型转化,如(int *)
下面是我在使用strcpy_s时遇到的小BUG:
strcpy_s(ps,strlen(animal), animal);//这是我一开始写的
问题出现在对strlen()的使用,这个函数计算的字符串长度是不包括’\0’的,所以在设置第二个参数(缓冲区长度)时,就会出现异常,因为在拷贝时需要将字符串的结束标志也要一同拷贝过去,所以,上面提示Buffer is too small就表明第二个参数设置的值小于源字符串。所以解决方法就是:将strlen(animal)修改为strlen(animal)+1,如下图,修改后调试通过。
strcpy_s(ps,strlen(animal)+1, animal);
阅读全文
1 0
- C++指针--字符串与指针
- 字符指针指针与字符串
- 字符串数组与字符串指针
- 字符串指针与字符串数组
- 字符串数组与指针
- 字符串与指针
- 字符串与指针
- 指针与字符串
- 字符串数组与指针
- 数组、指针与字符串
- 指针与字符串
- 指针与字符串
- 字符串与指针
- 字符串与指针
- 字符串与指针
- 字符串与指针
- 字符串与指针
- 字符串与指针
- spring-cache-1
- php微信企业付款到个人零钱
- protobuf无法使用open函数打开文件
- Failed to execute goal org.apache.maven.plugins
- cherry-pick 多个commit
- 指针与字符串
- 链表翻转
- 11.15第十一课
- 配置Spring连接mysql数据库
- Ubuntu 中安装 IDEA 报错:Warning the selected directory is not a valid tomcat home
- 如何下载行政区划边界?
- 如何利用openUrl打开另外一个app
- 移动端UI界面设计:APP字体排版设计的七个原则
- const T、const T*、T *const、const T&、const T*& 的区别