C语言,数组题目,第四题,为什么C,D两个选项是不合法的
3个回答
展开全部
要理解这个问题你要先理解字符数组和字符串常量的关系
C语言指针可以代替数组使用,会导致很多混淆概念。在一个字符数组a[]里,变量a实际上是一个指针,它指向数组的初始地址,即a[0]数据所在的地址,而整个数组的数据存储是连续的,它们被依次存放在从a[0]地址起始的相邻的存储单元内。
如char a[]={"Hello World"}一句,声明这一句后,编译器会开辟一片连续的空闲地址,并从第一个字符H开始,把Hello World\n这些字符依次存储到一片连续地址内,然后创建指针char *a,指向第一个字符H的起始地址。也就是:数组代表数组所在内存位置的首地址。
上面这句话同样也可定义为:char *a;a="Hello World"。一个字符型的指针为什么可以存储一串字符串?这些字符叫做字符串常量,而a存储的并不是这一串字符串常量,而是第一个字符H的起始地址。由于是连续存储的,只要知道起始地址,通过地址偏移就可以输出后面的字符,直到遇到\n为止。
因此再总结一遍:字符串数组存储的是第一个字符的地址。
而现在你就知道C为什么是错误的了。char a[2]={"a","b"},这句话声明了一个字符串数组,长度为2,但赋给了它两个字符串常量"a"和"b"同时作为起始地址,一个指针指向了两个地址,这会产生const char*型转char型的报错。正确写法应该为:char a[2]={‘a’,'b'}或char a[3]={"ab"},编译器会将字符a的起始地址传到指针a。D的错误也是一样的。
C语言指针可以代替数组使用,会导致很多混淆概念。在一个字符数组a[]里,变量a实际上是一个指针,它指向数组的初始地址,即a[0]数据所在的地址,而整个数组的数据存储是连续的,它们被依次存放在从a[0]地址起始的相邻的存储单元内。
如char a[]={"Hello World"}一句,声明这一句后,编译器会开辟一片连续的空闲地址,并从第一个字符H开始,把Hello World\n这些字符依次存储到一片连续地址内,然后创建指针char *a,指向第一个字符H的起始地址。也就是:数组代表数组所在内存位置的首地址。
上面这句话同样也可定义为:char *a;a="Hello World"。一个字符型的指针为什么可以存储一串字符串?这些字符叫做字符串常量,而a存储的并不是这一串字符串常量,而是第一个字符H的起始地址。由于是连续存储的,只要知道起始地址,通过地址偏移就可以输出后面的字符,直到遇到\n为止。
因此再总结一遍:字符串数组存储的是第一个字符的地址。
而现在你就知道C为什么是错误的了。char a[2]={"a","b"},这句话声明了一个字符串数组,长度为2,但赋给了它两个字符串常量"a"和"b"同时作为起始地址,一个指针指向了两个地址,这会产生const char*型转char型的报错。正确写法应该为:char a[2]={‘a’,'b'}或char a[3]={"ab"},编译器会将字符a的起始地址传到指针a。D的错误也是一样的。
展开全部
CD是合法的,但C会产生警告.而D则完全不会产生警告,而你没有把D后面半部分照全,所以没法帮到你.而C正是后面半部分说错了.
追问
谢谢~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C中字符初始化应使用单引号,如'A'。D中不能给数组名赋值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询