Keanu- 2024-05-26 11:18 采纳率: 100%
浏览 2
已结题

C语言字符指针学习中的相关问题

今天在学习字符指针时遇到了一个问题。

字符指针存储的字符串,应该只是存储首元素的地址。
例如//const char* p1 = "abcdef"; //只会存储‘a'的地址。

C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。

所以
const char* p1 = "abcdef";
const char* p2 = "abcdef";
这里的 p1 和 p2 的首元素’a'的地址应该是相同的

但是打印出的地址却是不同的。
对于这块知识我哪里的理解出了问题呢?

img


int main()
{
    const char* p1 = "abcdef";
    const char* p2 = "abcdef";
    printf("%p\n", &p1);
    printf("%p\n", &p2);

    if (p1 == p2)
        printf("p1==p2\n");
    else
        printf("p1!=p2\n");

    char arr1[] = "abcdef";
    char arr2[] = "abcdef";
    printf("%p\n", &arr1);
    printf("%p\n", &arr2);

    if (arr1 == arr2)
        printf("arr1 == arr2\n");
    else
        printf("arr1 != arr2\n");

    return 0;
}
  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-05-26 11:18
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    你的理解中有几个关键点需要澄清:

    1. 指针变量的地址与它们指向的字符串地址的区别

      • p1p2 是两个指针变量,它们存储的是字符串的地址,而不是字符串首字符的地址。当你使用 %p 格式化输出 p1p2 时,你实际上输出的是这两个指针变量自己的地址,而不是它们指向的字符串的地址。
      • 正确的输出它们指向的字符串地址的方式是 printf("%p\n", p1);printf("%p\n", p2);
    2. 指针变量的地址与它们指向的内存地址

      • p1p2 指向的字符串 "abcdef" 是常量字符串,它们通常存储在程序的只读数据段中。由于它们指向的是同一个字符串字面量,所以它们指向的内存地址应该是相同的。
      • 但是,&p1&p2 输出的是 p1p2 这两个指针变量自己的地址,它们是不同的,因为它们是两个不同的变量。
    3. 字符数组的地址

      • arr1arr2 是两个不同的字符数组,它们虽然被初始化为相同的字符串,但它们是两个独立的数组,存储在不同的内存位置。因此,它们的地址 &arr1&arr2 是不同的。
    4. 代码实现

      • 你的代码中,printf 语句中的 & 符号应该放在变量名前,而不是 %p 格式化符号前。正确的代码应该是:
        printf("%p\n", (void*)p1);
        printf("%p\n", (void*)p2);
        printf("%p\n", arr1);
        printf("%p\n", arr2);
        
      • 注意,由于 p1p2const char* 类型,直接传递给 printf 可能会导致警告或错误,因此需要强制类型转换为 (void*)
    5. 参考资料

      • C语言标准(ISO/IEC 9899:2011,即 C11标准)详细描述了指针、数组以及它们的行为。
      • 你可以查阅一些C语言的经典教材,如《C程序设计语言》(K&R)或者《C Primer Plus》等,这些书籍通常会详细解释指针和数组的概念。

    修正后的代码应该能够正确地输出 p1p2 指向的字符串地址,以及 arr1arr2 的地址。这样你就可以看到 p1p2 指向的地址是相同的,而 arr1arr2 的地址是不同的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月26日
  • 已采纳回答 5月26日
  • 创建了问题 5月26日

悬赏问题

  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色
  • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档
  • ¥15 字符串比较代码的漏洞
  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?