Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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 指向结构内部变量的指针_C_Pointers_Struct - Fatal编程技术网

C 指向结构内部变量的指针

C 指向结构内部变量的指针,c,pointers,struct,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; 然后我定义

我有一个这样的结构:

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)

问题是,使用来自程序其他部分的
tipoelem*pointerToInfo
编辑
tipoelem*info
字段安全吗,还是最好在结构celda中将其声明为指针
tipoelem*info

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

abb a;
int main(){
    tipoelem *ptr = a->info;
    ptr->comp_lexico = 2;
}
我定义了一个全局变量abb

它不是一个变量,而是一个
类型


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

现在,您可以使用abb,作为类似于
struct celda*
的类型

编辑之后,答案就是问题所要求的

例如:

如果需要
struct celda
的每个实例包含一个块信息,那么最好在
结构中允许一个指向它的指针。在设计方面,这是一件更好的事情,因为密切相关的数据保存得很好

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

要使用abb类型的变量访问int-inside-info,我将使用以下main:

#include <stdio.h>
void main(){
    abb variable;
    printf("comp_lexico es %d",variable->info.comp_lexico);
}
#包括
void main(){
abb变量;
printf(“comp_词典%d”,变量->info.comp_词典);
}

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

#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);
}
作为输出

类似地,您可以修改
struct-tipoelem
的成员,例如
comp\u-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);
}

在控制台上作为输出。因此,无论采用哪种方式都完全可以。

你能重新表述一下吗,这个问题很难理解;你想写哪一段代码?你认为这段代码中哪里有问题?不要通过
typedef
@OznOg隐藏指针,用更多信息编辑,这有点不同。我想做的是编辑对象一,它有
ptOne=&(pTwo->objectOne)
,然后是
ptOne->c='H'
。我不知道这是否安全。
#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