char *a = "hello"和char b[]="world"的区别

本文详细解析了C语言中指针与数组之间的区别,包括它们的类型差异、字符串存储位置的不同、作用域与生命周期的问题以及如何正确使用取址运算符和sizeof运算符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


       
+---+---+---+---+---+---+
    b: | h | e  |   l  |  l  |  o | /
0 |
       
+---+---+---+---+---+---+
       
+-----+     +---+---+---+---+---+---+
    a: |  *
======> | w | o | r | l | d | /0 |
       
+-----+     +---+---+---+---+---+---+

一、a与b类型不同:a为指向字符串的指针;b为保存字符串的数组。
    char *a = "hello" 是个字符串常量指针;
    char b[] = "hello" 是个赋初值的字符数组。
二、"hello"和"world"字符串保存的位置不同。"world"保存在堆栈
    中,其中的只可以修改(b[3] = 'F';);"hello"保存在全局数据
    区,位置是在.rodata中,不能修改(a[3] = 'A';错误)。
三、由上面第二条知:a是全局数据区,b是函数的栈空间区域,函数
    执行完成,这个空间可就没了。所以,return a;是可以的而
    return b;就很危险了。
四、只有2中情况下,数组名不可等同视为数组指针,&与sizeof操作符
    “&”的区别:
    &a取得是指针变量的地址,而非字符串"world"的首地址;&b取得
    就是字符串"hello"的首地址。
    “siziof”的区别:
    下面假设在ia32平台上运行,保存变量的内存空间不同。
    sizeof(s1); // return 4, pointer size
    sizeof(s2); // return 6, array size

 例子:

#include <stdio.h>
int main()
{
  
char *s="hello";
  
char s1[]="world";
  
return 0;
}

下面是GDB调试的结果:
(gdb) x
/s s1
0xbfffddd0:     "world"
(gdb) x
/s s
0x8048414 <_IO_stdin_used+4>:     "hello"
(gdb) p
/0x8048414
$
1 = 0x8048414
(gdb) x
/1cw 0xbfffddd0
0xbfffddd0:    119 'w'
(gdb) x
/1cw 0xbfffddd1
0xbfffddd1:    111 'o'
(gdb) x
/1cw 0xbfffddd4
0xbfffddd4:    100 'd'
(gdb) x
/1cw 0xbfffddd5
0xbfffddd5:    0 '/0'
(gdb) x
/1cw 0x8048414
0x8048414 <_IO_stdin_used+4>:    104 'h'
(gdb) p
/x s
$
2 = 0x8048414
(gdb) p
/&s
$
3 = 0xbfffddec
(gdb) x
/1xw 0xbfffddec
0xbfffddec:    0x08048414
(gdb) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值