关于结构的未初始化指针赋值的语义
Semantics of assignment of an unitialized pointer in regards to structures
好吧,假设你有这个结构:
struct Person
{
int age;
int height;
};
现在你有了这个函数来创建一个指向这个结构的指针:
struct Person *person (int *age, int *height)
{
struct Person *person = malloc(sizeof(Person));
person -> age = age;
person -> height = height;
return person;
}
然后,在主函数中你有这个:
struct Person *tom;
这是我的问题,我不知道是否要分配这些我这样做:
*tom = person(20, 70);
或者这样:
tom = person(20, 70);
如果需要进一步说明,请告诉我,我确定这只是我的一个简单的误解,唉。
您正在返回一个指针,因此无需取消引用您的指针。为了更清楚地说明这一点,如果你的函数 returns struct Person *
那么你的变量应该是 struct Person *
(这有例外,但这是常见的规则)。
这是要走的路:
tom = person(20, 70);
此外,您的签名中无需接收 int * (int *age, int *height):
struct Person *person (int *age, int *height)
除非您想修改函数内的 age
和 height
值。
我会坚持这样做:
struct Person *person (const int age, const int height)
一个对象的"pointer",就所有的意图和目的而言,是一个与对象本身完全不同的类型。例如,struct Person
和 struct Person*
是两种完全不同的类型——您甚至可以通过 运行 sizeof(struct Person)
注意到这一点,并将该输出与 sizeof(struct Person*)
进行比较。这是为什么?
嗯,"pointer" 是一个数字。仅此而已。我可以 (struct Person*) 0xDEADBEEF
, and it would be perfectly valid - C would accept it (note: don't attempt to dereference it, though, because that would lead to undefined behavior). However, even though a pointer is just a number, what that number means is more important - that number represents an address of where the actual data is stored. But remember, all a pointer is is just a number.
当您使用 malloc
分配一些内存时,它 returns 一个数字 - 这个数字引用内存中应该存储数据的点。这个数字可以像其他数字一样传递。但是,当 "dereferenced," C 实际处理您正在访问的内存中的数据时:
这个 "number" 可以由一个函数返回,传递给一个函数,以及其他数字可以做的所有其他奇特的事情。由于数字始终不变,取消引用指针将始终指向同一个地方。
您的 person()
函数 returns 一个数字 发生 以寻址内存中包含 Person 结构的特定位置。这个数字仍然是一个指针类型,所以将它赋值给一个指针是可行的:
struct Person* person(const int age, const int height);
struct Person* newPerson;
newPerson = person(20, 40);
希望对您有所帮助。
好吧,假设你有这个结构:
struct Person
{
int age;
int height;
};
现在你有了这个函数来创建一个指向这个结构的指针:
struct Person *person (int *age, int *height)
{
struct Person *person = malloc(sizeof(Person));
person -> age = age;
person -> height = height;
return person;
}
然后,在主函数中你有这个:
struct Person *tom;
这是我的问题,我不知道是否要分配这些我这样做:
*tom = person(20, 70);
或者这样:
tom = person(20, 70);
如果需要进一步说明,请告诉我,我确定这只是我的一个简单的误解,唉。
您正在返回一个指针,因此无需取消引用您的指针。为了更清楚地说明这一点,如果你的函数 returns struct Person *
那么你的变量应该是 struct Person *
(这有例外,但这是常见的规则)。
这是要走的路:
tom = person(20, 70);
此外,您的签名中无需接收 int * (int *age, int *height):
struct Person *person (int *age, int *height)
除非您想修改函数内的 age
和 height
值。
我会坚持这样做:
struct Person *person (const int age, const int height)
一个对象的"pointer",就所有的意图和目的而言,是一个与对象本身完全不同的类型。例如,struct Person
和 struct Person*
是两种完全不同的类型——您甚至可以通过 运行 sizeof(struct Person)
注意到这一点,并将该输出与 sizeof(struct Person*)
进行比较。这是为什么?
嗯,"pointer" 是一个数字。仅此而已。我可以 (struct Person*) 0xDEADBEEF
, and it would be perfectly valid - C would accept it (note: don't attempt to dereference it, though, because that would lead to undefined behavior). However, even though a pointer is just a number, what that number means is more important - that number represents an address of where the actual data is stored. But remember, all a pointer is is just a number.
当您使用 malloc
分配一些内存时,它 returns 一个数字 - 这个数字引用内存中应该存储数据的点。这个数字可以像其他数字一样传递。但是,当 "dereferenced," C 实际处理您正在访问的内存中的数据时:
这个 "number" 可以由一个函数返回,传递给一个函数,以及其他数字可以做的所有其他奇特的事情。由于数字始终不变,取消引用指针将始终指向同一个地方。
您的 person()
函数 returns 一个数字 发生 以寻址内存中包含 Person 结构的特定位置。这个数字仍然是一个指针类型,所以将它赋值给一个指针是可行的:
struct Person* person(const int age, const int height);
struct Person* newPerson;
newPerson = person(20, 40);
希望对您有所帮助。