问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-06 10:41

我来回答

5个回答

热心网友 时间:2022-06-29 19:24

一、概念不同

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]类型的唯一方法。

热心网友 时间:2022-06-29 19:24

楼上说的都有道理,但是没解释出本质区别。
区别就在于两个定义中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);
}

热心网友 时间:2022-06-29 19:25

第一种为定义一个指针变量;
第二种为定义一个数组;
如果定义时为其赋初始值,如char *str1 = "Hello World!"; char *str2[] = "Hello World!";前者编译器把"Hello World!"放在常量储存区;后者把"Hello World!"放在线程堆栈区,当str2离开作用域所占用内存即收回.

热心网友 时间:2022-06-29 19:25

两者都代表一个字符数组存储空间的首地址,区别在:
char *str;
这个变量可以进行指针运算,比如:
str++;
str--;
但如果定义成:
char str[];
则str++这样的语句是错误的,这个首地址不得进行赋值计算。
在不改变str指针指向地址的情况下,下面的语句是一样的结果。
printf("%s",str+2);

热心网友 时间:2022-06-29 19:26

而且char *str中str更方便活用因为是变量 所以可以进行多重操作,从某种意义上说,一般采用第一种方式去定义一个字符串,,注意下越界和初始化的问题就好了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦幻西游怎样查看自己怎么加的属性点阿? 我好长时间没玩了 .. 怎么... 梦幻西游怎么查看我各项加了多少点 卤肉料的配方 卤肉上色最好的配方前十 三国中曹操有几个儿子 曹植的意思是什么 曹操有多少个儿子?其中姓名叫什么? 简谱中1=c2/4是什么意思?别说几节几拍我不知道节和拍是什么意思 简谱四分之二什么意思 ...是鸡膏吗 放在老汤里行吗 怎么才能容于水 谢谢 怎么使用? x轴上得截距?那Y。必采纳 C语言的字符数组str[]的定义和用法? 已知直线L的倾斜角为60&#186;,在y轴上的截距为﹣4,求直线L的点斜式方程 C语言中char str[]是什么意思? 倾斜角为60°,在Y轴上的截距为-2的直线方程是? C语言问题 这里的str是什么意思,为什么没定义都能用? 对手价和市价的区别 倾斜角为135度,且在x轴上截距为3的直线方程是 求解析 国际礼仪的法国礼仪 C语言中str+3什么意思 倾斜角为60度,且在y轴上的截距为—3的直线方程为多少? 直线mx+ny+3=0在y轴上截距为-3且它的倾斜角是直线根号(3)x-y=3根号3倾斜角的2倍,则m,n为多少 c语言中str+1是什么意思啊? 刚了解法国的餐桌礼仪,竟然水果都不能用手吃!那谁能告诉我法国人怎么吃... 高一基础数学:倾斜角为60°,在Y轴上的截距为-2的直线方程是? 苹果怎么清理文稿和数据 直线x-y-5=0的斜率是___,倾斜角为___,在y轴上是截距是 帮忙解一下高一数学题(要有详细过程) 法国的餐桌礼仪是...? 直线l的倾斜角为60度,y轴上的截距为-4则截距式方程 期货交易中:跟盘价与最新价是相同的吗?! 这是c语言里的程序,char*str;语句是什么意思? c语言中s与str是一个意思吗 c语言问题关于编程中的str c语言中str[i]=0是什么意思? c语言中str1[80]是什么意思 str[ch-49]++在c语言中的含义是什么 pes master league money tool 怎么变成负数了 这样速写本手绘那么干净的线稿是怎么做到的 2020全国52个贫困县名单 女人第一次疼多久?会不会影响走路? 微信辅助验证,但没有绑定银行卡咋办 pes2010中master league青训问题 油炸土豆条的制作方法 平安福和金泰保险哪个好 佳能打印机怎么连接到电脑 浅谈中长跑中怎样掌握好呼吸方法 现在这个季节吃什么水果好? 应季的不贵的好水果 4、29 太平洋保险金泰人生是骗子,说0岁入20岁退保,老本和利息,可网上说就退不够,真是骗子啊 湖北华师一附中官网华一高国际部2021年分数线多少?招满了吗?补录吗?没有报志愿如何补录?_百度问一问