是否有可能取消引用指针的结构?

时间:2019-02-02 19:20:34

标签: c

我有指针的两d阵列结构。我试图结构复制到其他数组元素指向的斑点。对我而言,明确的方法是使用解引用运算符分配每个值。我不想做array[0][1] = array[1][0];,因为那样会分配该结构的地址。所以我在想,如果我能做到

*array[0][1] = *array[1][0];

作为复制结构的更快方法?

3 个答案:

答案 0 :(得分:1)

要复制 struct ,只需进行简单的分配即可。 memcpy()不是必需的-函数调用也不是首选。

struct {
  int piece;
  int color;
} chessman;

chessman p1, p2;
...
p1 = p2;

通过指向struct的指针数组,也可以。

chessman *array[8][8] = { 0 };

array[1][0] = malloc(sizeof *(array[1][0]));
assign_data(array[1][0]);

array[0][1] = malloc(sizeof *(array[0][1]));
assign_data(array[0][1]);
...
chessman empty = { 0 };
*array[0][1] = *array[1][0];
*array[1][0] = empty;

回想一下,这样的副本是浅副本。以下分配将指针复制到成员other_data中,而不是other_data引用的内容中。

struct {
  int piece;
  int color;
  foo *other_data;
} chessman2;

chessman q1, q2;

q1 = q1; 

答案 1 :(得分:0)

您可以执行*(array[0][1]) = *(array[1][0]);复制一个结构对象,但是您必须确保array[0][1]已经指向正确分配的一些内存。因此,如果array[0][1]到目前为止尚未初始化,则可以写

array[0][1] = malloc(sizeof(*array[0][1]));
*(array[0][1]) = *(array[1][0]);

答案 2 :(得分:0)

假设数组元素(指针)引用正确分配的位置,则没有更有效的方法来分配结构。

编译器知道结构的大小,并将为其发出最有效的代码。 <mat-card class="fields-list" *ngIf="tableShown"> <mat-card-content> <mat-card-actions align="end"> <button type="button" class="topia-btn topia-primary-btn action-buttons" (click)="addClicked()"> Add New Office </button> </mat-card-actions> <mat-table #table [dataSource]="officePinList"> <ng-container cdkColumnDef="label"> <mat-header-cell *cdkHeaderCellDef fxFlex="20%">Label</mat-header-cell> <mat-cell *cdkCellDef="let officePin" fxFlex="20%">{{officePin.label}}</mat-cell> </ng-container> <ng-container cdkColumnDef="postalAddress"> <mat-header-cell *cdkHeaderCellDef fxFlex="55%">Postal Adress</mat-header-cell> <mat-cell *cdkCellDef="let officePin" fxFlex="55%">{{officePin.postalAddress}}</mat-cell> </ng-container> <ng-container cdkColumnDef="trash-icon"> <mat-header-cell *cdkHeaderCellDef fxFlex="15%"></mat-header-cell> <mat-cell *cdkCellDef="let officePin" fxFlex="15%"> <mat-icon (click)="deleteGroupOffices(officePin.id)" mat-list-icon matTooltip="Delete" class="icon"> delete_forever </mat-icon> <mat-icon (click)="editField(officePin.id)" mat-list-icon matTooltip="Edit" class="icon">edit</mat-icon> </mat-cell> </ng-container> <mat-header-row *cdkHeaderRowDef="displayedColumns"></mat-header-row> <mat-row class="table-row" *cdkRowDef="let officePin; columns: displayedColumns;"></mat-row> </mat-table> 的方式会变慢。

memcpy

及其结果代码:

typedef struct 
{
    int a;
    double b;
    char c;
}a;

typedef struct 
{
    int a[5];
    double b[10];
    char c[100];
}b;

typedef struct 
{
    int a[50];
    double b[100];
    char c[100];
}l;


volatile a c[5];
volatile a *d[5] = {&c[0], &c[1], &c[2], &c[3], &c[4]};

volatile b e[5];
volatile b *f[5] = {&e[0], &e[1], &e[2], &e[3], &e[4]};

volatile l m[5];
volatile l *n[5] = {&m[0], &m[1], &m[2], &m[3], &m[4]};


void foo(void)
{
    *d[2] = *d[4];
}

void foo1(void)
{
    *f[2] = *f[4];
}

void foo2(void)
{
    *n[2] = *n[4];   
}