当我运行代码时:
char *abc="Goodbye";
for(i=0; i<=7; i++){
printf("%c\n",*(abc+i)); }
它运行没有问题,但是当我运行以下内容时:
char *der={'a','a','a','a','a'};
for(i=0; i<=4; i++){
printf("%c\n",*(der+i)); }
它没有显示正确的结果,我收到警告。
那么为什么会发生这种情况,因为"Goodbye"
和{'a','a','a','a','a'}
是字符数组?
答案 0 :(得分:2)
{'a','a','a','a','a'}
不是数组而是初始化列表,可用于初始化聚合或标量。
(是的,int x = {'a'};
有效。)
如果用于初始化标量(如指针),则只使用第一个值,因此der
的声明等同于
char *der = 'a';
你可能会看到问题所在。
今天的编程课程:
-Werr
。对于缺乏经验的人来说,这是一个更为重要的习惯。)答案 1 :(得分:1)
初始化数组的一种方法 - 与你的第二个例子相关 - 就是这样做:
Date Time Open High Low Close
390 2004-04-13 1900-01-01 09:31:00 1146.210 1147.020 1146.210 1147.020
391 2004-04-13 1900-01-01 09:32:00 1147.120 1147.339 1147.120 1147.219
392 2004-04-13 1900-01-01 09:33:00 1147.100 1147.630 1147.100 1147.630
393 2004-04-13 1900-01-01 09:34:00 1147.700 1147.700 1147.439 1147.469
394 2004-04-13 1900-01-01 09:35:00 1147.560 1147.730 1147.560 1147.680
395 2004-04-13 1900-01-01 09:36:00 1147.700 1147.700 1147.640 1147.640
396 2004-04-13 1900-01-01 09:37:00 1147.810 1147.810 1147.430 1147.430
397 2004-04-13 1900-01-01 09:38:00 1147.310 1147.310 1147.110 1147.110
398 2004-04-13 1900-01-01 09:39:00 1147.050 1147.050 1146.870 1146.870
399 2004-04-13 1900-01-01 09:40:00 1146.860 1147.120 1146.860 1147.110
400 2004-04-13 1900-01-01 09:41:00 1147.020 1147.170 1147.000 1147.170
401 2004-04-13 1900-01-01 09:42:00 1147.219 1147.250 1147.150 1147.210
402 2004-04-13 1900-01-01 09:43:00 1147.210 1147.210 1146.969 1146.969
403 2004-04-13 1900-01-01 09:44:00 1146.850 1146.850 1146.510 1146.510
404 2004-04-13 1900-01-01 09:45:00 1146.390 1146.510 1146.280 1146.510
405 2004-04-13 1900-01-01 09:46:00 1146.110 1146.110 1144.819 1144.819
406 2004-04-13 1900-01-01 09:47:00 1144.439 1144.439 1144.060 1144.060
407 2004-04-13 1900-01-01 09:48:00 1144.200 1144.350 1144.120 1144.120
408 2004-04-13 1900-01-01 09:49:00 1143.890 1143.930 1143.890 1143.930
409 2004-04-13 1900-01-01 09:50:00 1143.910 1144.010 1143.770 1144.010
410 2004-04-13 1900-01-01 09:51:00 1144.210 1144.360 1144.210 1144.360
411 2004-04-13 1900-01-01 09:52:00 1144.490 1144.850 1144.490 1144.850
412 2004-04-13 1900-01-01 09:53:00 1145.110 1145.219 1144.910 1144.910
413 2004-04-13 1900-01-01 09:54:00 1144.930 1144.969 1144.930 1144.960
414 2004-04-13 1900-01-01 09:55:00 1144.920 1144.920 1144.770 1144.770
415 2004-04-13 1900-01-01 09:56:00 1144.830 1144.939 1144.800 1144.800
在此语法中,在char foo[] = {'a', 'b', 'c'};
的右侧,您在=
内提供数组元素作为逗号分隔值。所以在上面的例子中,数组{ }
有三个元素。首先是foo
,第二个是a
,第三个是b
。如果您想在结尾处使用c
,则需要明确将其\0
。
关于你的第二个例子,@ molbdnilo的答案已经解释了你的语句char foo[] = {'a', 'b', 'c', '\0'};
在语义上的错误。如果您要将char *der={'a','a','a','a','a'};
定义为数组并使用der
对其进行初始化,则可以执行以下操作:
{ }
这样,您实际上是在定义一个char数组并使用您想要的内容对其进行初始化。
请注意,如果您在定义数组时没有初始化数组大小,则需要提及它。这意味着:
char der[] = {'a','a','a','a','a'};
但是,如果在定义数组时初始化数组,则提及大小是可选的,正如我们在上面的示例中所看到的那样。但是,如果您提到大小并且初始化程序小于数组大小,则其余元素将初始化为char foo[]; // Will give error because no size is mentioned
char foo[10]; // Fine because size is given as 10
。像:
0