结构指针的语法 - 链表

时间:2017-03-23 21:52:25

标签: c pointers syntax

我学习电子工程,我正在学习C作为我的第一语言。我一直在学习IIT C编程课程,当涉及指针时,通常需要花一点时间来理解程序。

我现在正在学习链接列表,我会把部分代码告诉你们我遇到了什么问题。我不会放一切,因为我认为没有必要。

typedef struct node_type {
    int data;
    struct node_type *next;
} node;

typedef node_type *list;

list head, temp;
char ch;
int n;
head = NULL;
scanf("%c", &ch);

while (ch == 'Y' || ch == 'y') {
    temp = (list)malloc(sizeof(node));
    temp->data = n;
    temp->next = head;
    head = temp;
    scanf("%c", &ch);

我无法理解为什么使用' - >'在使用指向结构的指针时,我现在知道temp->data = n;等同于(*temp).data = n;。但是我对第二个表达式的语法有问题,为什么使用它可以访问'temp'指向的结构体内的'data'。

在声明变量时,会出现如下所示的订单:http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html

我知道运营商有一个优先顺序。在声明中,我读*作为“指针”。我应该如何在代码中间阅读(*temp).data(不是声明)?

在课程开始时,Dr.PPChakraborty说*可以理解为“内容”,但在这个表达中没有意义:“临时的内容......”

  • 当声明中没有使用时,运算符*的含义是什么?
  • 使用typedef遵循int *a[]之类的声明规则? typedef int *a[]声明类型'a'是指向int?
  • 的指针数组

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

*temp表示指针取消引用。因此,当您撰写(*temp).data(*temp)的结果类型为node而非node*。因此,您可以使用.

访问结构字段

答案 1 :(得分:1)

  

我知道运营商有优先顺序。在声明中,我读*作为"指向"的指针。我应该如何在代码中间读取(* temp).data(不是声明)?

"检索data指向"的struct node_type个实例的temp成员。

图形:

      +---+        +---+
temp: |   |----->  |   | data <--- I want this
      +---+        +---+
                   |   | next
                   +---+
  

但我对第二个表达式的语法有疑问,为什么使用它可以访问数据&#39;在结构内部,临时&#39;指向。

表达式temp的类型为#34;指向struct node_type&#34;的指针。一元*运算符取消引用指向访问指向对象的指针。因此,表达式 *temp的类型为struct node_type

假设以下声明:

struct node_type instance;
struct node_type *pointer = &instance;

两个声明完成后,以下表达式为真:

 pointer == &instance;    // struct node_type * == struct node_type *
*pointer ==  instance;    // struct node_type   == struct node_type

 pointer->data == (*pointer).data == instance.data; // int == int == int
 pointer->next == (*pointer).next == instance.next; // struct node_type * == struct node_type *

成员选择运算符.->都与后缀运算符组合在一起,后者的优先级高于一元* - 编写了*temp.data编译器会把它解析为*(temp.data),这意味着&#34;我想要temp.data指向的东西。&#34;

图形:

      +---+              +---+
temp: |   | data ------> |   | <--- I want this
      +---+              +---+
      |   | next
      +---+

在这种特殊情况下,这不是你想要的。

正如您所发现的,temp->data相当于(*temp).data - ->运算符隐式取消引用temp指针。在处理指向structunion类型的指针时,您确实希望使用-> - 它不那么苛刻,并且您不太可能制作一个错了。

其他需要注意指针优先级问题的地方:

T *a[N];   // a is an N-element array of pointers to T

图形:

   +---+            +---+
a: |   | a[0] ----> |   | some instance of T
   +---+            +---+
   |   | a[1] --+
   +---+        |   +---+
    ...         +-> |   | some other instance of T
                    +---+

每个a[i]指向T类型的不同对象。要访问该对象,您需要取消引用数组元素 - *a[i]

T (*a)[N]; // a is a pointer to an N-element array of T

图形:

   +---+        +---+
a: |   | -----> |   | (*a)[0]
   +---+        +---+
                |   | (*a)[1]
                +---+
                 ---

要访问数组的元素,您需要在应用下标之前遵循指针a - 您想要索引事物a 点到,所以你需要写(*a)[i]

T *f();   // f is a function returning a pointer to T

函数f返回指针值;要访问被指向的东西,您需要遵守返回值:

x = *f();

请注意,这很少完成;你总是想对返回的指针值进行健全性检查。您更有可能看到:

T *p = f();
if ( p )
  x = *p;

最后,

T (*f)(); // f is a pointer to a function returning T

f指向一个函数 - 您必须取消引用f本身才能执行该函数:

x = (*f)();

根据声明,您可以了解如何使用每个版本的af