可以指向一个整数数组用于修改数组吗?

时间:2015-04-02 08:56:24

标签: c arrays

我正在为测试字符串文字和整数数组编写此代码。我需要有人帮我检查并照亮我。

1)。

 char NUM[] = "ABC";
 char *p_NUM=NUM;

 NUM[0]='D';

 puts(p_NUM);

 return 0;

如果从字符串文字创建数组,则可以修改它。

2)。

 char *p_NUM="ABC";

 p_NUM[0]='D';

 puts(p_NUM);

 return 0;

指向字符串文字的变量不能用于更改字符串的内容。所以这个会返回一个错误。

3)。

 int NUM[] = {1, 2, 3};
 int *p_NUM = NUM;

 p_NUM[0]=4;

 puts(p_NUM);
 printf("%i\n",p_NUM);

 int i;
 for(i=0;i<4;i++)printf("%i",p_NUM[i]);


 return 0;

puts(p_NUM);printf("%i\n",p_NUM);的结果非常有趣。我不知道为什么。

4)。

int *p_NUM = { 1, 2, 3 };

p_NUM[0] = 4;

int i;
for (i = 0; i < 4; i++)
    printf("%i", p_NUM[i]);

return 0;

这一个编译器返回一个错误,表示指向一个整数数组不能用于修改数组,对吗?

5)。

int NUM[] = { 1, 2, 3 }; int * p_NUM = NULL; // integer pointer

p_NUM = NUM; // integer pointer pointing to integer array

如果我这样写,是否一样?

int NUM[] = { 1, 2, 3 };
int * p_NUM = NUM; // integer pointer pointing to integer array

1 个答案:

答案 0 :(得分:2)

  1. char NUM[] = "ABC";
  2. NUM是一个char的数组,初始化为"ABC"。它在读写存储器中。它的大小为4,包括空终止符。


    1. char *p_NUM="ABC";
    2. p是指向字符串文字"ABC"的指针。 "ABC"放在只读内存中,因此无法修改。


      1. int NUM[] = {1, 2, 3};
      2. 与第1点相同。整数数组。但是,通过说for(i=0;i<4;i++),您将超出分配的内存,创建off-by-one错误,而这又会调用undefined behaviour

        您需要将循环条件更改为for(i=0;i<3;i++),因为C中的数组索引从0开始。


        1. int *p_NUM = { 1, 2, 3 };
        2. Invaild。错误情况。 p_NUM 不是 指向整数数组的指针。您的编译器应该非常有效地生成警告。在这种情况下,首先,括号括起列表将被视为p的初始化程序。它会产生双重警告

          4.1。 warning: initialization makes pointer from integer without a cast
             4.2。 excess elements in scalar initializer

          你想要的是

          int NUM[] = { 1, 2, 3 };
          int * p_NUM = NULL;              // integer pointer
          
          p_NUM = NUM;                     // integer pointer pointing to integer array
          
          p_NUM[0] = 4;                    //access array element thr' pointer and index
          
          int i;
          for (i = 0; i < 3; i++)          //notice the change here
              printf("%i", p_NUM[i]);
          
          return 0;