• 【C++ Primer Plus学习记录】指针——指针和字符串


    数组和指针的特殊关系可以扩展到C-风格字符串。请看下面的代码:

    1. char flower[10] = "rose";
    2. cout << flower << "s are red\n";

    数组名是第一个元素的地址,因此cout语句中的flower是包含字符r的char元素的地址。cout对象认为char的地址是字符串的地址,因此它打印该地址处的字符,然后继续打印后面的字符,直到遇到空字符为止。总之,如果给cout提供一个字符的地址,则它将从该字符开始打印,直到遇到空字符为止。

    前面的cout语句中最后一部分的情况如何呢?如果flower是字符串第一个字符的地址,则表达式“s are red\n”是什么呢?为了与cout对字符串输出的处理保持一致,这个用引号括起来的字符串也应当是一个地址。在C++中,用引号括起来的字符串像数组名一样,也是第一个元素的地址。上述代码不会将整个字符串发送给cout,而只是发送该字符串的地址。这意味着对于数组中的字符串、用引号括起额字符串常量以及指针所描述的字符串,处理的方式是一样的,都将传递它们的地址。与逐个传递字符串中的所有字符相比,这样的工作量确实要少。

    注意:在cout和多数C++表达式中,char数组名、char指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址。

    1. //4.20演示了如何使用不同形式的字符串
    2. #include
    3. #include //declare strlen()、strcpy()
    4. using namespace std;
    5. int main()
    6. {
    7. char animal[20] = "bear"; //char数组
    8. const char *bird = "wren"; //指向char的指针变量,将“wren”的地址赋给了指针bird
    9. char *ps; //指向char的指针变量,未被初始化,不指向任何字符串(这通常是个坏主义)
    10. //创建未初始化的指针有点像签发空头支票:无法控制它将被如何使用
    11. //对于cout来说,使用数组名animal和指针bird是一样的。它们都是字符串的地址
    12. cout << animal << " and " << bird << endl << endl;
    13. //试图将信息读入ps指向的位置将更糟。由于ps没有被初始化,因此并不知道信息将被存储在哪里,这甚至可能改写内存中的信息。
    14. //要避免这种问题很容易——只要使用足够大的char数组来接收输入即可。请不要使用字符串常量或未被初始化的指针来接收输入。
    15. cout << "Enter a kind of animal: ";
    16. cin >> animal;
    17. ps = animal; //复制地址,两个指针将指向相同的内存单元和字符串
    18. cout << ps << "!\n\n";
    19. //一般来说,如果给cout提供一个指针,它将打印地址。但如果指针的类型为char*,则cout将显示指向的字符串,如上一行代码。
    20. //如果要显示字符串的地址,则必须将这种指针强制转换为另一种指针类型,如int*。如下面的代码。
    21. cout << "Before using strcpy():\n"; //strcpy()将字符串从一个位置复制到另一个位置
    22. cout << animal << " at " << (int *)animal << endl;
    23. cout << ps << " at " << (int *)ps << endl << endl;
    24. ps = new char[strlen(animal) + 1]; //get new storage,strlen返回字符串的长度,即确定字符串的长度,并将它+1来获得包含空字符时该字符串的长度
    25. strcpy(ps, animal);
    26. cout << "After using strcpy():\n"; //strcpy()将字符串从一个位置复制到另一个位置
    27. cout << animal << " at " << (int *)animal << endl;
    28. cout << ps << " at " << (int *)ps << endl << endl;
    29. delete[] ps;
    30. system("pause");
    31. return 0;
    32. }

  • 相关阅读:
    高并发、多线程、分布式都不懂,你拿什么跳槽阿里、腾讯、京东?还不好好学习啊
    水塘抽样(应用场景+算法步骤+算法证明+Python实现)
    Node.js中的单线程服务器
    JavaScript设计模式中的单一职责原则
    天津工业大学计算机考研资料汇总
    地图与WebGIS、地图的作用、数字地图的应用
    Python基础List列表定义与函数
    opencv中边缘检测的方法
    Window + Ubuntu 双系统无Ubuntu Bios 启动项
    Mac 环境变量配置(待补充)
  • 原文地址:https://blog.csdn.net/qq_39072304/article/details/133855774