我正在为测试字符串文字和整数数组编写此代码。我需要有人帮我检查并照亮我。
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
答案 0 :(得分:2)
char NUM[] = "ABC";
NUM
是一个char
的数组,初始化为"ABC"
。它在读写存储器中。它的大小为4
,包括空终止符。
char *p_NUM="ABC";
p
是指向字符串文字"ABC"
的指针。 "ABC"
放在只读内存中,因此无法修改。
int NUM[] = {1, 2, 3};
与第1点相同。整数数组。但是,通过说for(i=0;i<4;i++)
,您将超出分配的内存,创建off-by-one
错误,而这又会调用undefined behaviour。
您需要将循环条件更改为for(i=0;i<3;i++)
,因为C
中的数组索引从0
开始。
int *p_NUM = { 1, 2, 3 };
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;