参考链接1: C语言中,箭头符号 “->” 和点号符号 “.”的区别
参考链接2: 【转】C语言中 -> 是什么意思?
在此感谢各位前辈大佬的总结,写这个只是为了记录学习大佬资料的过程,内容基本都是搬运的大佬博客,觉着有用自己搞过来自己记一下,如果有大佬觉着我搬过来不好,联系我删。
C语言学习——C语言中,箭头符号 “->” 和点号符号 “.”的区别(2023.12.16)
一、C语言中 -> 是什么意思?
->是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。
举个例子:
struct Data
{
int a,b,c;
}; //定义结构体
struct Data * p; //定义结构体指针
struct Data A = {1,2,3}; //声明变量A
int x; //声明一个变量x
p = &A ; //让p指向A,取A变量的地址给p
x = p->a; //这句话的意思就是取出p所指向的结构体中包含的数据项a赋值给x
//由于此时p指向A,因而 p->a == A.a,也就是1
对于一开始的问题 p = p->next;这应该出现在C语言的链表,这里的next应该是一个与p同类型的结构体指针,其定义格式应该是:
struct Data
{
int a;
struct Data * next;
};/*定义结构体*/
/*
…………
*/
main()
{
struct Data * p;/*声明指针变量p*/
……
p = p->next;/*将next中的值赋给p*/
}
举个较容易理解的例子方便理解:
前提:楼里有屋子,屋子里有人;
屋子里面有人,这个人就是变量,人在屋子内(变量储存在这个地方);
屋子(比如说是301屋子)就是地址;
当你要去上课,学校会给你课表,课表里显示要去哪里上课(哪个楼哪个屋),这个信息就是指针,指向了上课地点,根据这个指针前往教室,你能看到这个教室里都有谁(变量);
那结构体呢?结构体就相当于是有好几个房子组成的别墅,几个房子绑定在一起使用(地址是连续的)。假设现在有很多这种别墅分布在一个大迷宫里,每间别墅里都有一间房子。里面放了另一个别墅的位置信息,现在你手拿定位器找到了第一栋别墅,从里面得到了你想要的东西(链表的数据部分),然后把下一栋别墅的位置计入你的定位器(p = p->next),再走向下一栋别墅……如此走下去,知道走到某地下一栋别墅信息没有了(p->next == NULL),你的旅行结束。这就是链表一次遍历的过程。
二、C语言中,箭头符号 “->” 和点号符号 “.”的区别
在C语言中,箭头符号“->” 用于访问结构体(struct)或联合体(union)类型的成员。它可以替代点号(.)来访问结构体或联合体的成员,当通过指针访问时使用箭头符号。例如,假设有一个结构体类型的指针变量p,其中包含成员变量x,可以使用箭头符号来访问x,例如 p->x。这是因为p是一个指针,而不是结构体本身。
箭头符号 “->” 和点号符号 “.” 在C语言中都用于访问结构体或联合体类型的成员,但它们之间有一些重要的区别。
1.语法:
点号 “.” 主要用于直接访问结构体或联合体变量的成员。例如,如果有一个结构体变量s,其中包含成员变量x,可以使用 s.x 访问 x。
箭头符号 “->” 主要用于通过指针访问结构体或联合体的成员。例如,如果有一个指向结构体的指针变量p,其中包含成员变量x,可以使用 p->x 访问 x。
2.对象类型:
点号 “.” 用于直接访问结构体或联合体变量的成员。
箭头符号 “->” 用于通过指针访问指向结构体或联合体的成员。
3.使用场景:
点号 “.” 主要用于直接操作结构体或联合体变量。
箭头符号 “->” 主要用于通过指针操作结构体或联合体。
总之,点号和箭头符号在访问结构体或联合体成员时使用的语法和对象类型有所不同,取决于你是直接操作变量还是通过指针访问。
三、举例说明
以下是两个例子来对比点号 “.” 和箭头符号 “->” 的不同之处:
例子1:使用点号 “.”
#include <stdio.h>
//声明一个结构体,花括号里面是结构体成员列表,即每个成员变量
//其struct声明的位置,也就是这段代码要放到哪里。同样这也是具有作用域的。
struct Person {
char name[20];//声明一个字符数组
int age;
};
int main() {
struct Person p1;把p1设为一个可以使用Person结构体的结构体变量,则p1这个变量就包含了其Person结构体中的所有元素
strcpy(p1.name, "John");//把后面的复制到前面的变量中,即p1.name=“John”;
p1.age = 25;
printf("Name: %s\n", p1.name);//Name:John
printf("Age: %d\n", p1.age);//Age:25
return 0;
}
输出:
Name: John
Age: 25
在这个例子中,我们声明了一个结构体类型 Person,并使用点号 “.” 直接访问结构体变量 p1 的成员。通过赋值和打印语句,我们直接操作 p1 的成员变量 name 和 age。
例子2:使用箭头符号 “->”
#include <stdio.h>
#include <stdlib.h>
struct Person {
char name[20];
int age;
};
int main() {
struct Person *p2;//* 是解引用运算符,用于访问指针所指向的内存地址上的值。如果p2是一个指针变量,*p2就是该指针所指向的值。
p2 = (struct Person*) malloc(sizeof(struct Person));//分配长度为sizeof(struct Person)字节的内存块,然后????
strcpy(p2->name, "Emily");//把后面的复制到前面的变量中,即p2->name=“Emily”;
p2->age = 32;
printf("Name: %s\n", p2->name);
printf("Age: %d\n", p2->age);
free(p2);
return 0;
}
输出:
Name: Emily
Age: 32
在这个例子中,我们声明了一个指向结构体的指针变量 p2,并使用箭头符号 “->” 通过指针访问结构体的成员。通过动态内存分配(malloc)来分配结构体内存,并操作 p2 指向的结构体的成员变量 name 和 age。
通过这两个例子,你可以看到点号 “.” 和箭头符号 “->” 在语法和使用方式上的不同。点号用于直接操作结构体变量的成员,而箭头符号用于通过指针访问结构体的成员。