指向结构

时间:2017-11-15 09:53:32

标签: c pointers struct

我有这样的结构:

typedef struct{
    char *lexema;
    int comp_lexico;
    union{
        double v;
        double (*fnctptr)();
    } valor;
}tipoelem;

struct celda {
    tipoelem info;
    struct celda *izq, *der;
};

typedef struct celda * abb;

然后我定义了一个全局变量abb,它具有全局范围。如果我以某种方式得到celda字段信息的内存方向,我是否能够安全地修改它?或者最好将字段定义为tipoelem指针,例如(tipoelem *info)

问题是,从prrogram的其他部分编辑带有tipoelem info的{​​{1}}字段是否安全,或者最好将其声明为结构中的指针tipoelem *pointerToInfo celda?

编辑了更多信息: 我想修改tipoelem *info的方式是下一个,我不知道它是否安全。

tipoelem info

3 个答案:

答案 0 :(得分:0)

我定义了一个全局变量abb,

它不是变量,而是type

作为编辑后问题的答案: -

现在,您可以将abb用作与struct celda*类似的类型。

编辑后答案就是问题所在。

例如:

如果需要struct celda的每个实例来包含块信息,那么最好在structure内允许指向它的指针。在设计方面,这是一个更好的事情,密切相关的数据保持紧密。

另一件事是假设你在结构变量之外保留一个指向tipoelem的指针。然后假设在一段时间后你需要另一个指向tipoelem的指针,那么这两个指向tipoelem的指针的含义是不同的。这就是保持结构更好的原因。

答案 1 :(得分:0)

要使用 type abb 的变量访问 int 内部信息,我会使用此主要内容:

#include <stdio.h>
void main(){
    abb variable;
    printf("comp_lexico es %d",variable->info.comp_lexico);
}

答案 2 :(得分:0)

是的,这样访问是安全的。 考虑这个例子,

#include<stdio.h>

struct stOne {
    int a;
    int b;
    char c;
};

struct stTwo {
    struct stOne ObjectOne;
    struct sttwo *pTwo;
};

struct stOne *pOne;
struct stTwo *pTwo;
struct stTwo ObjectstTwo;

int main() {

    pTwo = &ObjectstTwo;   
    pTwo->ObjectOne.c = 'H';
    printf("%c", ObjectstTwo.ObjectOne.c);

    pOne = &pTwo->ObjectOne;
    pOne->c = 'D';
    printf(" %c", ObjectstTwo.ObjectOne.c);
}

此代码打印

H

作为输出。

同样,您可以修改struct tipoelem的成员,例如comp_lexico int

struct celda objectCelda;

//Assuming abb is a pointer, Make abb point to an object
abb = &objectCelda;

//Modify the value of comp_lexico
abb->info.comp_lexico = 0xAA;

现在更改代码,

#include<stdio.h>

struct stOne {
    int a;
    int b;
    char c;
};

struct stTwo {
  struct stOne ObjectOne;
  struct sttwo *pTwo;
};

struct stOne *pOne;
struct stTwo *pTwo;
struct stTwo ObjectstTwo;

int main() {

    pTwo = &ObjectstTwo;   
    pTwo->ObjectOne.c = 'H';
    printf("%c", ObjectstTwo.ObjectOne.c);

    pOne = &pTwo->ObjectOne;
    pOne->c = 'D';
    printf(" %c", ObjectstTwo.ObjectOne.c);
}

打印

H D

在控制台上作为输出。所以无论如何都可以这样做。

相关问题