免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 17654 | 回复: 27
打印 上一主题 下一主题

字符数组、字符指针、字符串常量问题求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-28 10:38 |只看该作者 |倒序浏览
一直对字符数组和字符指针比较迷糊,最近想彻底搞清楚了,看了很多资料,却越看越迷糊,到CU上来请大家指教

  1.         char str1[]       = "abc";
  2.         char str2[]       = "abc";
  3.         const char str3[] = "abc";
  4.         const char str4[] = "abc";
  5.         const char* str5  = "abc";
  6.         const char* str6  = "abc";
  7.         char* str7                  = "abc";
  8.         char* str8                  = "abc";

  9.         cout << ( str1==str2 ) << endl; // 输出0
  10.         cout << ( str3==str4 ) << endl; // 输出0
  11.         cout << ( str5==str6 ) << endl; // 输出1
  12.         cout << ( str7==str8 ) << endl; // 输出1

  13.         cout << &("abc") << endl;                // 输出abc
  14.         cout << &(&("abc")) << endl;        // 输出abc
  15.         cout << &(&(&("abc"))) << endl; // 输出abc,好像无论在"abc"前加几个&,输出都为abc

  16.         cout << "abcdef"[0] << endl;        // 输出a
复制代码

上面的输出好多都不太明白,想请高手们通过上面的例子讲讲字符数组、字符指针等,我想应该还是有比较多的XDJM不太清楚,或曾经在这上面迷惑过。

论坛徽章:
0
2 [报告]
发表于 2005-04-28 10:52 |只看该作者

字符数组、字符指针、字符串常量问题求教

数组是一块静态存储区,一旦开辟一个数组,系统就要给它分一个存储区,不同区域地址当然不同;指针则是存储区的地址,只是一个数而已,指向相同存储区的指针当然相同
按你的例子,机器里是这样存储的(地址值是我瞎设的)
地址     内容
0x10 ->; abc     str1
0x20 ->; abc     str2
0x30 ->; abc     str3
0x40 ->; abc     str4
0x50 ->; abc     str5-8
所以就有程序的输出结果

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2005-04-28 10:55 |只看该作者

字符数组、字符指针、字符串常量问题求教

  1.    cout << ( str1==str2 ) << endl; // 输出0
  2.    cout << ( str3==str4 ) << endl; // 输出0
  3.    cout << ( str5==str6 ) << endl; // 输出1
  4.    cout << ( str7==str8 ) << endl; // 输出1
复制代码

是用来比较指针的,这段意义不大。前两个必然是 0,后两个碰巧是 1。

  1.    cout << &("abc") << endl;      // 输出abc
  2.    cout << &(&("abc")) << endl;   // 输出abc
  3.    cout << &(&(&("abc"))) << endl; // 输出abc,
复制代码

>;>;>;好像无论在"abc"前加几个&,输出都为abc
没错,就是这样,因为 & 是取地址。取 10 遍还是取。

  1. cout << "abcdef"[0] << endl;   // 输出a
复制代码

这个很有意思。方括号 [] 运算符在 C 中实际上是一个“变址运算符”,[0] 表示取前面地址指向的第一个元素,元素的类型依耐于地址的类型。
因为 "abcdef" 是指向 char 类型的指针,所以 [0] 就表示取 "abcdef" 这个指针指向的第一个 char 类型元素,也就是 'a'。

总结:上面的几个测试,该测的没有测,不该测的抓住了瞎测。

结论:回家看书去!
先搞清楚什么是指针再说。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2005-04-28 11:04 |只看该作者

字符数组、字符指针、字符串常量问题求教

[quote]原帖由 "xyzzy"]指向相同存储区的指针当然相同[/quote 发表:

是否指向相同的存储区还很难说,不一定。
得看编译器环境和编译参数。

论坛徽章:
0
5 [报告]
发表于 2005-04-28 11:09 |只看该作者

字符数组、字符指针、字符串常量问题求教

如果对于相同的常数,编译器还分配了不同的内存保存,只能说这编译器太土

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2005-04-28 11:32 |只看该作者

字符数组、字符指针、字符串常量问题求教

[quote]原帖由 "xyzzy"]如果对于相同的常数,编译器还分配了不同的内存保存,只能说这编译器太土[/quote 发表:

土也是客观存在不是?
而且 ANSI C 又不保证这个。

这就好比拖欠了你的工资固然不对,
可是拖欠了农民工的工资也得给不是?

论坛徽章:
0
7 [报告]
发表于 2005-04-28 14:47 |只看该作者

字符数组、字符指针、字符串常量问题求教

原帖由 "flw" 发表:

结论:回家看书去!
先搞清楚什么是指针再说。

谢谢flw版主的热心讲解,指针我能理解,书也看得不少,但我的基础学得还是不够扎实,所以学习的过程中就想请教各位高手。
这个问题我问得不够好,没有表达出我想问的意思,我弄不太清楚的是当定义变量的时候,内存是怎么分配的(如语句char str1[]= "abc"; 此时str1应该也是作为指针存放的吧?还有"abc"这个字符常量是如何存放的?是不是定义str1时,分配了一块内存,存放的是一个指向存放abc这个字符常量的指针?如果是的话,那定义char str1[]= "abc"; 跟char* str7= "abc"; 岂不一样?)以及使用str1~8时,什么时候是用的地址,什么时候用的却是对应的字符串?(如:str1==str2作比较的时候是地址,而当cout << str1 << endl;的时候又是指字符串)。
xyzzy兄台讲的正是我非常想听的,但我还是不是很理解,我弄不清楚的是静态存储区、堆、栈等是如何使用的吧,想继续请教各位高手,尤其是flw版主,请不吝指教。

论坛徽章:
0
8 [报告]
发表于 2005-04-28 15:14 |只看该作者

字符数组、字符指针、字符串常量问题求教

数组char str1[]在内存中存储方式:str和&str是同一个值,也就是说str本身在内存中没有占用空间,str、&str和&str[0]的值是一样的,只是直接给str[]的数组元素分配了空间。指针char *str7在内存中的存储方式:首先会给str7变量本身分配空间,也就是说str7和&str7的值肯定是不一样的,&str7就是str7的地址,在指针初始化后才给指针char *str7所指向的字符串明确的分配空间,当然这个空间的首地址就是str的值。所以数组和指针还是有区别的,只是编译器对指针的处理是按照处理数组的方式来处理的。

论坛徽章:
0
9 [报告]
发表于 2005-04-28 16:00 |只看该作者

字符数组、字符指针、字符串常量问题求教

[quote]原帖由 "rainshadow"]?胤峙淞丝占洹V刚隿har *str7在内存中的存储方式:首先会给str7变量本身分配空间,也就是说str7和&str7的值肯定是不一样的,&str7就是str7的地址,在指针初始化后才给指针char *str7所指向的字符串明确的分配空间?.........[/quote 发表:

谢谢rainshadow,刚才到处找了一些东西看了,现在又看了你的解释,终于明白了“字符指针”和“字符数组”的区别。
再次感谢。
明白了char str1[]= "abc";const char* str5 = "abc";这样的定义中,str1和str5是为何不同的。
现在想继续请教这两个语句中的“abc”在内存中是怎么存储的?
还有,对于str1和str5,何时用的是它们对应的字符串的值,何时是这些字符串的地址?
我问的问题对大家可能非常浅,但却正是我这种基础不扎实的人常常犯迷糊的地方,希望懂的人指点啊

论坛徽章:
0
10 [报告]
发表于 2005-04-28 16:54 |只看该作者

字符数组、字符指针、字符串常量问题求教

明白了char str1[]= "abc";const char* str5 = "abc";这样的定义中,str1和str5是为何不同的。
现在想继续请教这两个语句中的“abc”在内存中是怎么存储的?


str1[] = "abc";                  /*此处的"abc"存储在栈中*/
const char* str5 = "abc"; /*此处的"abc"存储只读存储区,可能在DATA  SEGMENT*/

若想修改字符串的内容,用str1[]形式
若想使用不同的常量字符串,用str5形式[/quote]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP