
+---+---+---+---+---+---+
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/x 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/x &s
$3 = 0xbfffddec
(gdb) x/1xw 0xbfffddec
0xbfffddec: 0x08048414
(gdb) 
指针与数组区别
本文详细解析了C语言中指针与数组之间的区别,包括它们的类型差异、字符串存储位置的不同、作用域与生命周期的问题以及如何正确使用取址运算符和sizeof运算符。

被折叠的 条评论
为什么被折叠?



