c语言字符串指针指针型数组中字符串在内存中的存储方式

指针看的有点糊涂啊,指针数组是如何存储字符串的?_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:501,223贴子:
指针看的有点糊涂啊,指针数组是如何存储字符串的?收藏
是不是给每个字符串都留一处内存空间,然后指针数组中数组元素就是每个字符串的第一个字符的地址?char *a[]={........}格式输出时printf(&%s&, a[2]),这个a[2]就是第三个字符串的第一个字符的地址?
“健康随e保”可保障儿童41种重大疾病。150元起/年,给孩子45万高额保障。
a[2]是一个指针。另外printf("%s",...);的用法有点奇怪。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或2032人阅读
C/C++(7)
&&& 字符串是以ASCII字符NUL结尾的字符序列。ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中。不过,并非所有的字符数组都是字符串,字符数组可能没有NUL字符。字符数组也用来表示布尔值等小的整数单元,以节省内存空间。
&&&&C中有两种类型的字符串:
&&&& 单字节字符串
&&&& 由char数据类型组成的序列
&&&& 宽字符串
&&&& 由wchar_t数据类型组成的序列
&&&& wchar_t数据类型用来表示宽字符,要么是16位宽,要么是32位宽。这两种字符串都以NUL结尾。可以在string.h中找到单字节字符串函数,而在wchar.h中找到宽字符串函数。宽字符主要用于非拉丁字符集,对于支持外语的应用程序很有用,
&&&& 字符串的长度是字符串中除了NUL字符外的字符数。为字符串分配内存的时候,要记住为所有的字符加上NUL字符分配足够的空间。
&&&& NULL和NUL不一样。NULL用来表示特殊的指针,通常定义为((void*)0),而NUL是一个char,定义为\0,两者不能混用!
&&& 字符常量是单引号引起来的字符序列。字符常量通常由一个字符组成,也可以包含多个字符,比如转义字符。在C中,它们的类型是int,如下所示:
printf(&%d\n&,sizeof(char));
printf(&%d\n&,sizeof('A'));
字符串声明
&&& 声明字符串的方法有三种:字面量,字符数组,和字符指针。
字符串字面量是用双引号引起来的字符序列,常用来进行初始化,他们位于字符串字面量池中。&span style=&color:#ff0000;&&这和单引号引起来的字符不一样!&/span&
&& 下面是一个字符数组的例子:
char header[32];
&&& 下面是字符指针:
字符串字面量池
&&& 定义字符量通常会将其分配到字面量池中,这个内存区域保存了组成字符串的字符序列。多次会用到同一个字面量时,字面量池通常会只有一个副本。这样可以减少应用程序占用的内存。通常认为字面量是不可变的,因此只有一份副本不会有什么问题。
&& 字符串字面量一般分配在只读区域中,所以是不可变的。字符串字面量在哪里使用,或者他是全局,静态或者局部都无所谓,从这个角度讲,字符串字面量不存在作用域的概念。
&& 在大部分编译器中,我们将字符串字面量看做常量,无法修改字符串。但是GCC编译器容许字符串字面量可以修改。
char *header = &Sound&;
*header = 'L';
printf(&%s\n&,header);
&& 这样就会改变字符串,不是我们预期的结果。因此应该避免这样做。像下面这样把变量声明为常量可以解决一部分问题。任何修改都会造成编译时错误:
const char *header = &Sound&;
字符串初始化
&&&&&&& 初始化字符串采用的方法取决于变量是被声明为字符数组还是字符指针,字符串所用的内存要么是指针指向的一块内存。我们都可以用字符串字面量或者一些列字符初始化字符串,或者从别的地方(标准输入)得到字符。
&&&初始化char数组
&& 我们可以用初始化操作符初始化char数组。在下例中,header数组被初始化为字符串字面量中所包含的字符:
char header[] = &Media Player&;
&& 字符量&Media Player&的长度为12,表示这个字面量需要13个字节,我们就要为数组分配13个字节来持有字符串。初始化操作会把这些字符复制到数组中,以NUL结尾。
&& 我们也可以用strcpy函数来初始化数组。
&&& 初始化char指针
&&&&& 用动态内存分配来初始化char指针。
char *header = (char*)malloc(strlen(&Media Player&)+1);
&&&& 注意不要用sizeof操作符,而要用strlen函数来确定已有字符串的长度,sizeo操作符会返回数组和指针的长度,而不是字符串的长度。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:35801次
排名:千里之外
原创:36篇
评论:41条
(2)(2)(4)(5)(2)(1)(2)(8)(11)关于字符串存储于字符数组
关于字符串存储于字符数组
&&& 给字符指针赋字符串并不是将一个长长的字符串存于字符指针变量中,而是将字符串常量存储于常量区,并将存储这个字符串的首字节地址赋给指针变量,让指针变量指向字符传常量的首字符。对于以字符串作为字符数组初值的情况,要求字符数组足够的大,能存得下字符串常量。这里有一个特别的规定,若数组的大小少于存储字符串有效字符的字节个数,系统将报告错误;当字符数组的大小只能存储字符串的有效字符,而不能存储字符串结束标记符时,则存储于字符数组中的内容是字符序列,因没有存储字符串结束标记符,存储的内容就不是字符串。
  如代码char a[5]=“ABCDE”。另外,给字符数组元素逐一赋字符初值,并在字符初值中没有字符串结束标记符,则存于字符数组中的内容也不是字符串。如代码 char s[5]={‘A’,‘B’,‘C’,‘D’,‘E’}.特别要注意当字符指针还未指向某个字符数组的元素时,不可以通过字符指针输入字符串。如代码char *s;scanf(“%s”,s)。若写成char *str;scanf(“%s”,&str)更是错误的了。由于C语言规定数组不能相互赋值,所以只能将字符串常量赋给某字符指针。如代码char *s;s=“ABCDE”是正确的。实际上,字符串“ABCDE” 被存储于常量区中,向指针变量赋的是字符指针,让s指向其中的字符‘A’
发表评论:
TA的推荐TA的最新馆藏[转]&C语言(12)
#include&stdio.h&
#include&string.h&
char* strcpy1(){
char *p = &hello kitty&;
printf(&%s\n&, p);
int main(){
printf(&%s&, strcpy1());
字符串在内存中存储在只读数据段,当定义一个字符串指针时,该指针指向这个只读区域,即使在函数中将这个指针返回,只读区域的位置没变,因此也可以正常运行,一般在定义一个字符串指针时,前面加const,这样当试图修改字符串内容时,编译器会报错。
#include&stdio.h&
#include&string.h&
char* strcpy1(){
char p[20] = &hello kitty&;
printf(&%s\n&, p);
int main(){
printf(&%s&, strcpy1());
在定义了一个字符数组时,“hello kitty”这个字符串仍然会在只读数据段中保存,但同时栈上会为p开辟一个20*4的空间,并将只读数据段中的内容复制到这个栈上的数组空间内,因此当试图返回p时,返回的并不是只读数据段中字符串的位置,而是p在栈上的临时地址,而函数结束后这个临时地址即失效了,打印的话结果是未知的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3108次
排名:千里之外
原创:27篇
评论:16条
(1)(8)(3)(4)(1)(6)(5)(7)2010年5月 C/C++大版内专家分月排行榜第三2010年3月 C/C++大版内专家分月排行榜第三2010年1月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 c语言指针与字符串 的文章

 

随机推荐