c语言 char *str 与char str[] 这俩种定义字符串到底有什么区别

 我来答
园林植物手册
高粉答主

2018-12-16 · 关注我不会让你失望
知道答主
回答量:191
采纳率:100%
帮助的人:9.5万
展开全部

一、概念不同

char *str 声明的是一个指针,这个指针可以指向任何字符串常量。char str[] 声明的是一个字符数组,数组的内容可以是任何内容,严格意义上说,末尾加上'\0' 之后才能算是字符串,

二、变量不同

char *str里的str是指针变量,str的值未初始化(局部变量的话。全局则自动初始化为NULL)。char str[ ]里str是地址常量,str的值是str[ ]的地址。

三、定义方法不同:

在char * str中,明显str的类型是char*。这没什么特殊的,只是一个简单的char指针。char str[]是不能这样定义的,所以假定用char str[6] = "abcde";那么这里str的类型是char[6](6个,不是5个,因为最后有个0) ,而这种定义语句也是定义一个char[6]类型的唯一方法。

hpmv
2013-01-07 · TA获得超过885个赞
知道小有建树答主
回答量:279
采纳率:0%
帮助的人:133万
展开全部
楼上说的都有道理,但是没解释出本质区别。
区别就在于两个定义中str的类型不同。

第一个,在
char * str;
中,明显str的类型是char*。这没什么特殊的,只是一个简单的char指针。

第二个,char str[];是不能这样定义的,所以假定用
char str[6] = "abcde";
那么这里str的类型是char[6](6个,不是5个,因为最后有个0) ,而这种定义语句也是定义一个char[6]类型的唯一方法。char[6]是什么意思呢?他不是char*,也不是char* const (以下讨论这个),而是一个特殊的类。这个类的大小是6字节(比如sizeof(str)返回6),它可以用[ ]来返回一个char&(比如str[3]的类型是char&),但是自身不能直接被修改,比如str ="abcde";就不可以。

我刚才说char[6]很像char* const。这是因为,假如有
char* const str2 = "abcde";
那么str和str基本有同样的行为,比如str2[3]也是一个char&,而且str2 = "abcde"也不可以用,但是char* const和char[6]有本质的不同。前者只是一个指针。什么意思呢,就是str2的值是"abcde"的地址(而"abcde"被存在其他的地方),而str的内存值直接就是6个字节,"abcde"。所以两者还是截然不同的类型。比如,sizeof(str2)是4(32位操作系统)或8(64位),而sizeof(str)是6.

char[6]可以被直接转换为char*。转换的时候,得到的结果是一个指向第一个元素的指针。反过来,char*也可以转换为char[6],转换的结果是一个变量指向char*所指向的那个内存区域。

楼上说的str++可以在char* str时用而不能在char str[6]时用,这是因为数组类型 char[6]不能用作一个左值。

楼上还有说char * str可以指向任何字符串常量。这个是无必要的。char *可以指向任何内存区域,不一定必须是字符串常量。当然,如果指向一个无效内存,用的时候会出问题。

另外楼上说一个"Hello World!"放在常量储存区,一个"Hello World!"放在线程堆栈区,这也是不对的。事实上,无论如何,"Hello World!"本身都在常量储存区。而:
char *str = "Hello World!";
会在堆栈上储存一个4个字节(假定32位系统)的指针指向储存"Hello World!"的区域。

char str[] = "Hello World!";
会首先在堆栈上先分配一个13字节的char数组,然后把常量储存区的那个"Hello World!"复制过来。
追问
#include 
void main()
{
int i;
char *s="eff"; /*您说说s[i]时,char*与char s[]="eff"的区别 为什么这程序里char*是乱码 另一个程序就这样调用没问题*/
for (i = 0; s[i] != '\0'; i++)
{
if ((s[i] >= 'a') && (s[i] <= 'z'))
{
printf("az %d %s\n",s[i],s);
s[i] = s[i] - 32;
printf("az %d\n",s[i]);
}
}
printf("[%s]\n", s);
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
aZHaKaLa
2013-01-06 · TA获得超过105个赞
知道答主
回答量:64
采纳率:0%
帮助的人:42.7万
展开全部
char *str 声明的是一个指针,这个指针可以指向任何字符串常量;
char str[] 声明的是一个字符数组,数组的内容可以是任何内容,严格意义上说,末尾加上'\0' 之后才能算是字符串
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
changchengz0
2013-01-07 · TA获得超过127个赞
知道答主
回答量:70
采纳率:0%
帮助的人:51.5万
展开全部
两者都代表一个字符数组存储空间的首地址,区别在:
char *str;
这个变量可以进行指针运算,比如:
str++;
str--;
但如果定义成:
char str[];
则str++这样的语句是错误的,这个首地址不得进行赋值计算。
在不改变str指针指向地址的情况下,下面的语句是一样的结果。
printf("%s",str+2);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
luo_xuewu
2013-01-07 · TA获得超过917个赞
知道小有建树答主
回答量:444
采纳率:0%
帮助的人:340万
展开全部
第一种为定义一个指针变量;
第二种为定义一个数组;
如果定义时为其赋初始值,如char *str1 = "Hello World!"; char *str2[] = "Hello World!";前者编译器把"Hello World!"放在常量储存区;后者把"Hello World!"放在线程堆栈区,当str2离开作用域所占用内存即收回.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式