我正在学习 C 并试图理解什么是句号“。”正在处理变量 x 和 a;这个操作叫什么,它做什么?
这里是完整的代码:
#include <stdio.h>
#include <stdlib.h>
// Create a structure called myStructure
struct T {
int *a;
struct T* next;
};
int *y;
int **z;
struct T x;
struct T* p1;
struct T* p2;
struct T** p3;
int main()
{ p1 = (struct T*)malloc(sizeof(struct T));
p2 = &x ;
y = (int *) malloc(sizeof(int));
{int* a[3];
a[1] = (int *) malloc(sizeof(int));
z = &a[1];
x.a = *z; // point 1
(*p1).a = *z; // point 2
}
(*p1).next = p1; // point 3
p2 = p1; // point 4
p3 = &p1; // point 5
p3 = *(&p3) ; // point 6
p3 = &(*p3) ; // point 7
x.a = y ; // point 8
z = x.a ; // point 9
free(x.a); // point 10
}
.
运算符称为结构/联合成员运算符(奇怪的是,仅以这种方式在索引中引用)。它不适用于数组。 struct T
类型有两个成员 a
和 next
。 struct T x;
定义了一个类型为x
的对象struct T
,表达式x.a
表示访问对象a
的成员x
。相关的是箭头运算符->
,它做同样的事情,除了左侧是一个指针,例如(&x)->a
,或p1->a
。
这里是 C17 规范的相关部分,6.5.2.3,p。 59:
后缀表达式后跟 .运算符和标识符指定结构或联合对象的成员。该值是命名成员的值,97)并且如果第一个表达式是左值,则该值是左值。如果第一个表达式具有限定类型,则结果具有指定成员类型的限定版本。
后缀表达式后跟 -> 运算符和标识符指定结构或联合对象的成员。该值是第一个表达式指向的对象的命名成员的值,并且是一个左值。98)如果第一个表达式是指向限定类型的指针,则结果具有该类型的限定版本指定会员