我学习电子工程,我正在学习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?感谢任何帮助。
答案 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
指针。在处理指向struct
和union
类型的指针时,您确实希望使用->
- 它不那么苛刻,并且您不太可能制作一个错了。
其他需要注意指针优先级问题的地方:
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)();
根据声明,您可以了解如何使用每个版本的a
和f
。