字符数组名,无名字符串和字符指针有什么区别?
发布网友
发布时间:2022-04-23 05:48
我来回答
共3个回答
热心网友
时间:2023-10-17 07:04
定义:
char ch[10];
char ch2[];
char* str;
以及"string"。
1.全局的变量和函数内的static变量,存放在内存堆区域。
2.全局的数组和函数内定义的static的数组,存放在内存堆区域。
3.局部变量,数组,存放在内存的栈区域。
4.定义char ch[10]时,如果是全局或者static的,就在堆区域给他分配10byte的空间,并且如果用户没有给它初值,10byte数据全部置零。
5.定义char ch[10]时,如果是局部数组(在函数内定义且不是static的),则在栈区域分配10byte的空间,如果用户没有给它初值,10byte的数据未知,为内存中原来的不确定数据。
6.定义char * str时,给str分配一个4byte的空间,用于保存一个地址。该地址可以指向任意地方。如果没有给它初值,则其中数据是该片内存原来的数据,所以会指向一个不确定的地方,这时候如果对该指针指向的地方赋值,可能会因破坏未知地址内存数据,造成系统崩溃。
7.“string”在代码中出现时,自动分配空间,在内存中的存放是string\0,占用7个byte. “string”本身可以作为一个地址来看,该地址就是s字母所在的内存位置。
8.str=“string”是: 开始已经定义了一个char 指针str,且没指向任何地方。 该语句,把一个string字符串加上\0结束符存放在内存中,并且把该字符串的地址,也就是s的地址,即“string”给str,使str指向“string”所在的空间。
9.ch=“string”是不对的。 ch是一个数组。数组名虽然也就是数组第一个元素的地址。与指针有相似的地方。但是指针可以指向任意的地方。数组一旦定义,其地址就是固定的,数组名ch所指向的地方就只能是ch[0]的地址,是不能够修改的,不能够再指向其他的地方了。 这里可以理解为系统给ch数组分配了一段10byte的空间。“string”也有另一段7byte的空间,但是ch是不能重新指向“string”所在的地方的。
10.str=NULL同第8项。 str定以后,指向未知区域。 后面可以把str指向一个有效区域或者一个NULL区域。最好在定义的时候就给它指向NULL区域,以免出现第6项中的崩溃问题。在使用str的时候,再给它一个有效地址,如第8项中的赋值。
11.ch=NULL同第9项。ch作为数组名,内存是在定义时就分配好的。不能再指向其他地方,或者NULL。
12.在定义并初始化 char *str时,可以char *str=ch,数组ch的起始地址,给str,把该地址存放在str所在的4byte空间中。
12.在定义之后,赋值时,str=?? 是把??作为一个地址,给到str,存放在str所在的4byte的内存空间,如第6项。所以会出现类似str=ch2,或者str=“string”,这个语句的作用是让str指向其他的地址。另不能出现str=12等现象,因为12做作为一个地址,在内存中的数据是程序员不知道的,万一该地址的数据被修改了,会破坏系统数据,造成未知问题。
13.*str=?? 是把??作为一个字符,给到*str,存放在str所指向的地址内存空间。该语句的作用是改变str所指向的空间内所存储的值,而不会改变str所指向的地方。例如char *str=“string”; *str=‘F’,则以%s格式打印出str后,输出为Ftring。另%s格式输出,会一str所指向的地址开始,一直输出到\0结束。
14.??=*str,是把str所指向的地址的数据,赋值给??。 例如如果str指向“string”, 则char c=*str的作用等同于char c=‘s’。
15.ch为数组名,其指向的地方不能改变,但其指向的地方的内容可以改变。如ch=??不对。但是ch[0]='W'是正确的。
16.str是指针,指针本身占有4byte的存储空间,该空间内存储了一个数据,该数据是内存中其他地方的地址。所以可以通过修改该数据,来使str指向其他的地址,如第12项。也可以通过*str来修改str所指向的地址内所存储的数据,如第13条。
17.“string”是一个地址。该地址就是s字母所在的地址。他可以作为一个地址赋值给指针,如str=“string”(在指针str定义,并初始化时,可以char *str=“string”格式。)
18.ch的固定性,你可以把ch 按照 char * const ch理解。即ch指向的地址不能变。但ch指向地址内的数据可以变。
热心网友
时间:2023-10-17 07:05
你学过C吗?
首先:1.str和ch这两个是什么关系,str是个指针,ch呢,是个数组的首地址,这两个虽然可以地址一样,但其含义大不相同,ch定义大小后是不能用数组名给其赋值的,就想你给10个小朋友糖,你不能只给第一个,那其他的小朋友会不理你的^_^,下面我不说你也明白了吧。
2.下面我们来说说*str与str:
char *str;char str;你说这两个是什么意思?
很明显,*str与str是一个意思,就是变量的值。我们回头看
char *str;知道了*str,那str就好办了,
我给你说下*与&,还有[]的关系:
你知道&是取地址,我们把他看作门,这个*呢,防盗门钥匙=-=-,关门,开门,呵呵,意思就是他们俩可以抵消,就是说:
*&p=p;也许你又要问了,&&p是什么意思啊?我靠,你家防盗门有几个啊?&&p逻辑错误;[]这个就是地址运算符,没什么好说的;知道为什么*str='s';str="string";补充一点,"string"赋值是他是字符串的首地址(我想你知道);
cout<<*str 输出S嘛,cout<<str 肯定输出string咯;
3.最后这问题,我给你个好的处理方法:
从后往前理解(只是大师的说法,嘿嘿,抄袭下):
const char* p;//指向字符常量, pointer to char const;
char const *p;//同上,一个意思
char* const p;//指向常量字符地址 pointer to const char*;
const char* const p;//常量p指向常量字符地址
const pointer to const char*.
好了,没我的事了.....
热心网友
时间:2023-10-17 07:05
ch相当于一个不能修改地址的指针,指向数组的第一个元素。
ch不能赋空,不过可以初始化,你可以这样声明。
char ch[10] = {'\0'};
就可以把全部元素置空。
str还没分配空间,不能直接存储数据,分配空间后*str=也可以用,不过只表示一个字符。
简单的说ch是个不能修改的指针,str可修改,"string"是个字面值常量,就是个以'\0'结尾的字符数组。