使用c中的指针初始化数组

时间:2016-08-10 21:35:24

标签: c arrays

当我运行代码时:

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'}是字符数组?

2 个答案:

答案 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