我有点困惑。请查看以下程序:
#include<stdio.h>
void display (int *j, int *k);
int main()
{
int num1[]={1,2,3,4,5};
int num2[5];
int i;
display (num1,num2);
for (i=0;i<=4;i++)
printf("%d,", num2[i]);
return 0;
}
void display (int *j, int *k)
{
int l;
for (l=0;l<=4;l++)
{
k=j;
printf("%d,", *k);
j++;
k++;
}
}
在此printf("%d,", num2[i]);
中没有给出数组。但是当我们将*k=*j;
放在函数中时,它就有效。你能解释一下原因吗?感谢。
答案 0 :(得分:1)
k=j
将指针k
指定给指针j
的值(地址指向)。这会切换哪个数组(num1
或num2
)k
指向但不会更改任何数组元素的值。
*k=*j
将k
指向的数组元素设置为数组元素j
指向的值。
答案 1 :(得分:0)
因为您尚未初始化数组num2
,也未从num1
复制它。
答案 2 :(得分:0)
*k = *j
将“单元格”j
点的内容复制到指向的单元格k
。相反,k = j
使k
指向j
指向的位置。如果你考虑这个,k = j
是错误的,因为你不改变数组的内容,而只是改变局部变量k
。因此,在您的示例中,display
内的print语句实际上不会打印num2
,而是num1
(在print语句中,k
指向与j
相同的位置,这是num1
)的元素。
答案 3 :(得分:0)
声明k = j;
表示“将j
中存储的值指定为k
的值”,只是将j
中存储的值复制到k
}。它对数组没有任何作用,只是指针k
指向j
指向的地址。赋值和增量仅影响局部变量j
和k
,没有别的。
当您撰写*k = *j;
时,它实际上意味着“将地址内容j
分配给地址k
”,该地址执行复制,并递增j
和{{ 1}}将它们指向下一个数组元素。