指针与字符串

本文探讨了指针与字符串的关系,指出数组名是首字符的地址,因此在输出时会打印直到遇到空字符为止。字符串常量也被视为地址,处理方式相同。当指针作为`cout`对象时,若指针类型为`char`,则打印所指字符串。在使用`strcpy_s`时,注意`strlen()`不包含结束符``,拷贝时需加上1以避免缓冲区溢出。解决方案是将`strlen(animal)`更改为`strlen(animal)+1`。

1.先来看一个程序:

char flower[10] = "roses";   //数组
char *s = "red";             //从这里看出"red"实际是一个地址,并将地址赋给了指针s
cout << 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值