Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用for循环与结构指针复制数组元素_C_Arrays_Pointers_Struct - Fatal编程技术网

C 使用for循环与结构指针复制数组元素

C 使用for循环与结构指针复制数组元素,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,如果我有两个相同大小的数组 int pa1[100]; int pa2[100]; 我知道,如果在代码中的某个点,我想复制pa1中pa2的内容 pa1 = pa2; 这不是正确的方法。相反,我可以使用一个循环。但是,我认为如果我有两个结构指针(ps1、ps2),那么可以编写: *ps1 = *ps2; 如果该结构包含一个100 int数组,我让ps1和ps2分别指向pa1和pa2,那么前面的指令和复制数组中每个元素的循环之间有什么区别 for (int i = 0; i<100; i

如果我有两个相同大小的数组

int pa1[100];
int pa2[100];
我知道,如果在代码中的某个点,我想复制pa1中pa2的内容

pa1 = pa2;
这不是正确的方法。相反,我可以使用一个循环。但是,我认为如果我有两个结构指针(ps1、ps2),那么可以编写:

*ps1 = *ps2;
如果该结构包含一个100 int数组,我让ps1和ps2分别指向pa1和pa2,那么前面的指令和复制数组中每个元素的循环之间有什么区别

for (int i = 0; i<100; i++) pa1[i] = pa2[i]; 

for(inti=0;i在这种情况下,编译器通常使用标准的C函数
memcpy
。这比使用手动编写的循环快得多。

你是说

int pa1[100], pa2[100];
int *ps1 = pa1, *ps2 = pa2;

// Initialize the arrays

*ps1 = *ps2;
如果是,那么最后一行所做的就是:

pa1[0] = pa2[0];
没有别的了。 如果需要将一个数组的所有元素复制到另一个数组,则将需要对它们进行迭代

编辑:再读一遍,我想你的意思是:

struct a{
    int v[100];
};

int pa1[100], pa2[100];
a *ps1, *ps2;

// Initialize the arrays

ps1 = (a*)pa1;
ps2 = (a*)pa2;

*ps1 = *ps2;
非常聪明,尽管你不会找到你问题的明确答案。这是特定于实现的,尽管许多实现似乎使用memcpy或类似的东西,witch可能只比迭代数组快一点。另外,编译器将使用迭代轻松优化两个数组之间的副本,因此dif引用可能可以忽略不计,并且不值得在编写结构和指针时付出额外的努力


因此,这里真正的问题是:为什么需要这样的优化?

是的,正如下面的程序所示,它是有效的

不,您不能确定编译器将选择在内部执行的代码。但编译器很可能会发出非常有效的代码,如调用memcopy(但无需包含)或使用优化的程序集

但这不能保证。您必须测试或分析生成的程序集输出

在可读性方面,我认为复制结构至少比显式循环或对memcopy的调用更容易阅读。如果这两个数组与其他与数组相关的变量相比较,那么这可能会更好,因为这些变量也可以进入结构

#include <stdio.h>

int main() {

    struct {
        int t[10];
    } s1, s2;

    int i = 0;
    for(i=0; i < 10 ; ++i){
        s1.t[i] = i;
        s2.t[i] = -1;
    }

    printf("s1 [%d %d ... %d %d] s2 [%d %d ... %d %d]\n",
        s1.t[0], s1.t[1], s1.t[8], s1.t[9], 
        s2.t[0], s2.t[1], s2.t[8], s2.t[9]);

    s2 = s1;

    printf("s1 [%d %d ... %d %d] s2 [%d %d ... %d %d]\n", 
        s1.t[0], s1.t[1], s1.t[8], s1.t[9], 
        s2.t[0], s2.t[1], s2.t[8], s2.t[9]);

}
#包括
int main(){
结构{
int t[10];
}s1,s2;
int i=0;
对于(i=0;i<10;++i){
s1.t[i]=i;
s2.t[i]=-1;
}
printf(“s1[%d%d…%d%d]s2[%d%d…%d%d]\n”,
s1.t[0],s1.t[1],s1.t[8],s1.t[9],
s2.t[0],s2.t[1],s2.t[8],s2.t[9]);
s2=s1;
printf(“s1[%d%d…%d%d]s2[%d%d…%d%d]\n”,
s1.t[0],s1.t[1],s1.t[8],s1.t[9],
s2.t[0],s2.t[1],s2.t[8],s2.t[9]);
}

啊,我明白了。也许是我刚刚编辑的内容中的某些内容?@cassiorenan解释我具体使用这些结构和阵列所做的事情可能需要太长时间。我可以说我使用的是一个资源有限、实时性能要求很高的微控制器应用程序。因此,我需要优化每个应用程序我尽可能多地使用一行代码来保证最佳的实时性能。我在试图避免循环时想到了这个想法。我一直在想,也许这也取决于MCU如何管理内存,在其硬件架构级别上,我错了吗?@esal26你在使用现代编译器吗?通过修改你的代码,你会使它变得更复杂像gcc这样的编译器很难优化。(但是,如果你被一个20年前的错误设置所困扰,那么你可能没有选择)@Mattmcnab我正在使用avr gccA modern compiler,它可能会将您的两个选项视为相同的操作,并且应该发出相同或相似的代码。在这种情况下,最好编写可读性代码。第二个最好的选项是显式调用
memcpy()
,编译器也可以对其进行优化。