指针与字符串

来源:互联网 发布:历史数据库 编辑:程序博客网 时间: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);
原创粉丝点击