用字符串初始化的指针

一.  简介

前一篇文章简单学习了数组与指针的区别,文章如下:

C语言中数组与指针的区别-CSDN博客

本文学习一下 初始化为 字符串的 指针。防止使用过程中出现问题。

二.  初始化指针来指向字符串

初始化指针来指向字符串,例如如下代码就是初始化指针来指向字符串:

char *ptr = "hello world!";

指针形式 (*ptr) 也使得编译器为字符串在静态存储区预留了 13个元素的空间,另外,一旦开始执行程序,它会为 指针变量 ptr 留下一个存储位置,并把字符串的地址村存在指针变量中,该变量最初指向该字符串的首地址。

通过打印如下代码,分析:

#include <stdio.h>

#define   MSG  "hello world"

int main(void) 
{
    char buf[] = MSG;
    const char* ptr = MSG;

    printf("address MSG: %p\n", MSG);
    printf("address buf: %p\n", buf);
    printf("address ptr: %p\n", ptr);
    printf("address of \"hello world\": %p\n", "hello world");

    return 0;
}

输出结果如下:

该程序的输出结果说明什么?

第一,指针ptr 和 MSG 的地址相同,而 与 数组 buf 的地址不同。这就说明,字符串数组中的字符串是从 静态存储区的重新拷贝了一份。印证了 前一篇文章关于数组的说明:

C语言中数组与指针的区别-CSDN博客

第二,直接使用 printf函数打印 字符串常量 "hello world" 的地址,该字符串的地址与 MSG的地址相同,说明编译器只是使用了一个存储位置,也就说明编译器可以把多次使用的相同字符串常量存储在一处或多处,另一个编译器可能在不同的位置存储了三个 "hello world"。

第三,静态数据使用的内存与 buf数组使用的动态内存不同。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 10:20:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 10:20:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 10:20:07       87 阅读
  4. Python语言-面向对象

    2024-05-11 10:20:07       96 阅读

热门阅读

  1. C++ sort()排序详解

    2024-05-11 10:20:07       35 阅读
  2. NSS刷题

    NSS刷题

    2024-05-11 10:20:07      34 阅读
  3. 新能源汽车为什么容易自燃

    2024-05-11 10:20:07       29 阅读
  4. vscode触发建议缓慢问题

    2024-05-11 10:20:07       35 阅读
  5. Linux下MySQL的用户与权限管理

    2024-05-11 10:20:07       35 阅读
  6. 蓝桥杯 算法提高 ADV-1169 区间覆盖问题 python AC

    2024-05-11 10:20:07       33 阅读
  7. VSCODE + SSH for PHP 配置

    2024-05-11 10:20:07       38 阅读
  8. MyBatis——MyBatis 核心配置文件

    2024-05-11 10:20:07       32 阅读
  9. 三生随记——耳机里的诅咒

    2024-05-11 10:20:07       25 阅读
  10. 2.mysql--备份恢复

    2024-05-11 10:20:07       33 阅读