-
2021-08-22 15:31:24
这两个在结构体虽然常用,但有时候很容易让人用混淆了,程序编译不通过。
1、一般情况下使用“.”,只需要声明一个结构体。这个一般用在结构体变量的使用。
格式是,结构体类型名+结构体名。
然后用结构体名加“.”加域名就可以引用域 了,因为自动分配了结构体的内存。
2、用“->”,则要声明一个结构体的指针,还需要手动开辟一个该结构体的内存空间,
然后把返回的指针给声明的结构体指针,才能用“->”正确引用。
这个用在结构体指针变量。如果内存中只分配了指针的内存,没有分配结构体的内存,
将会导致想要的结构体实际上是不存在。
这时候用“->”引用自然出错了,因为没有结构体,自然没有结构体的域了。
3、此外,(*a).b 等价于 a->b。
4、总结
"."一般情况下读作"的”。
“->”一般读作"指向的结构体的"。
更多相关内容 -
C语言中->含义,比如说 p=p->next
2019-06-24 15:13:09换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”. 举个例子: struct Data { int a,b,c; }; /*定义结构体*/ struct ...->叫做结构体指针运算符,也是用来访问结构体内部成员的。换种说法,如果我们在C语言中定义了一个结构体,然后声明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.
举个例子:struct Data { int a,b,c; }; /*定义结构体类型*/ struct Data * p; /* 定义结构体指针 */ struct Data A = {1,2,3}; / * 声明结构体变量A,A即结构体名 */ int x; /* 声明一个变量x */ p = &A ; /* 地址赋值,让p指向A */ x = p->a; /* 取出p所指向的结构体中包含的数据项a赋值给x */ /* 此时由于p指向A,因而 p->a == A.a,也就是1 */
因为此处p 是一个指针,所以不能使用.号访问内部成员(即不能p.a),而要使用->。但是A.a是可以的,因为A不是指针,是结构体名。
一般情况下用“.”只需要声明一个结构体。格式是:结构体类型名+结构体名。然后用结构体名加“.”加成员名就可以引用成员了。因为自动分配了结构体的内存。如同 int a;一样。
用“->”,则要声明一个结构体指针,还要手动开辟一个该结构体的内存(上面的代码则是建了一个结构体实例,自动分配了内存,下面的例子则会讲到手动动态开辟内存),然后把返回的地址赋给声明的结构体指针,才能用“->”正确引用。否则内存中只分配了指针的内存,没有分配结构体的内存,导致想要的结构体实际上是不存在。这时候用“->”引用自然出错了,因为没有结构体,自然没有结构体的域了。
此外,(*p).a 等价于 p->a。
而对于 p = p->next;这应该出现在C语言的链表,其中的next应该是自定义的一个与p同类型的结构体指针,定义格式为:
struct Data { int a; struct Data * next; };/*定义结构体*/ ………… main() { struct Data * p;/*声明指针变量p*/ …… p = p->next;/*将next中的值赋给p*/ }
以下是参考《啊哈!算法》中的链表中的每一个结点应该如何存储(我的理解是结点就类似java等面向对象编程中的实例对象)
如上图,每一个结点都由两个部分组成。左边的部分用来存放具体的数值,那么用一个整型变量就可以;右边的部分需要存储下一个结点的地址,可以用指针来实现(也称为后继指针)。这里我们定义一个结构体类型来存储这个结点,如下。
struct node { int data; struct node *next; };
上面代码中,我们定义了一个叫做node 的结构体类型,这个结构体类型有两个成员。第一个成员是整型data,用来存储具体的数值;第二个成员是一个指针,用来存储下一个结点的地址。因为下一个结点的类型也是struct node,所以这个指针的类型也必须是struct node* 类型的指针。如何建立链表呢?首先我们需要一个头指针head 指向链表的最开始。当链表还没有建立的时候头指针head 为空(也可以理解为指向空结点)。
struct node *head; head = NULL;//头指针初始为空
现在我们来创建第一个结点,并用临时指针p 指向这个结点。
struct node *p; //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点 p=(struct node *)malloc(sizeof(struct node));
接下来分别设置新创建的这个结点的左半部分和右半部分。
scanf("%d",&a); p->data=a;//将数据存储到当前结点的data域中 p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
下面来设置头指针并设置新创建结点的*next 指向空。头指针的作用是方便以后从头遍历整个链表。if(head==NULL) head=p;//如果这是第一个创建的结点,则将头指针指向这个结点 else q->next=p;//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
如果这是第一个创建的结点,则将头指针指向这个结点。
如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点。
最后要将指针q 也指向当前结点,因为待会儿临时指针p 将会指向新创建的结点。q=p;//指针q也指向当前结点
当然,完整的代码是下面的那样子:
#include <stdio.h> #include <stdlib.h> //这里创建一个结构体用来表示链表的结点类型 struct node { int data; struct node *next; }; int main() { struct node *head,*p,*q,*t; int i,n,a; scanf("%d",&n); head = NULL;//头指针初始为空 for(i=1;i<=n;i++)//循环读入n个数 { scanf("%d",&a); //动态申请一个内存空间,用来存放一个结点,并用临时指针p指向这个结点 p=(struct node *)malloc(sizeof(struct node)); p->data=a;//将数据存储到当前结点的data域中 p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空 if(head==NULL) head=p;//如果这是第一个创建的结点,则将头指针指向这个结点 else q->next=p;//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点 q=p;//指针q也指向当前结点 } //输出链表中的所有数 t=head; while(t!=NULL) { printf("%d ",t->data); t=t->next;//继续下一个结点 } getchar();getchar(); return 0; }
需要说明的一点是:上面这段代码没有释放动态申请的空间,虽然没有错误,但是这样会很不安全,有兴趣的朋友可以去了解一下free 命令。
-
C语言中 -> 是什么意思?
2020-08-25 15:39:08换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”. 举个例子: struct Data { int a,b,c; }; /*定义结构体*/ struct ...-> 是一个整体,它是用于指向结构体、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*/
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*/
}
链表指针是C语言的一个难点,但也是重点,学懂了非常有用。要仔细讲就必须先讲变量、指针。
扩展资料:
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。
由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。
链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。
链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。
程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。
参考资料:链表–百度百科
-
【转】C语言中 -> 是什么意思?
2017-05-04 20:52:20换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”. 举个例子: struct Data { int a,b,c; }; /*定义结构体*/ struct ...->是一个整体,它是用于指向结构体、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*/ 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*/ } 链表指针是C语言的一个难点,但也是重点,学懂了非常有用。要仔细讲就必须先讲变量、指针。 什么是变量?所谓变量,不要浅显的认为会变得量就是变量。套用我们院长的问话:“教室变不变?”变,因为每天有不同的人在里面上课,但又不变,因为教室始终在那,没有变大或变小。这就是变量:有一个不变的地址和一块可变的存储空间。正常情况下,我们只看到变量这个房间里面的东西,也就是其内容,但不会关注变量的地址,但是C语言的指针,就是这个房间的地址。我们声明变量就相当于盖了间房子存放东西,我们可以直接观看房子里的东西,而声明指针,就是相当于获得了一个定位器,当用指针指向某个变量时,就是用指针给变量定位,以后我们就可以用指针找到他所“跟踪”的变量并可以获得里面的内容。 那结构体呢?结构体就相当于是有好几个房子组成的别墅,几个房子绑定在一起使用。假设现在有很多这种别墅分布在一个大迷宫里,每间别墅里都有一间房子。里面放了另一个别墅的位置信息,现在你手拿定位器找到了第一栋别墅,从里面得到了你想要的东西(链表的数据部分),然后把下一栋别墅的位置计入你的定位器(p = p->next),再走向下一栋别墅……如此走下去,知道走到某地下一栋别墅信息没有了(p->next == NULL),你的旅行结束。这就是链表一次遍历的过程。现在你能明白 p=p->next的含义了吧! 写了这么多。希望你能明白。 如果想学好c和C++,链表和指针必须熟练掌握!
-
C语言中->、.、&、*、**各符号的区别
2021-06-15 16:46:33(1)->和.的区别: 针对结构体类型,.用来访问结构体中的普通变量值;->是用来访问结构体类型中的结构体指针变量。 参考链接:C 语言中,「.」与「->」有什么区别? - 知乎 (2)&和*的区别: &在C++中表示引用。在... -
C语言中 -> 是什么意思?
2019-04-21 20:31:48(p = p->next),再走向下一栋别墅……如此走下去,知道走到某地下一栋别墅信息没有了(p->next == NULL ),你的旅行结束。这就是链表一次遍历的过程。现在你能明白 p=p->next的含义了吧! 写了这么多。希望你能... -
C语言链表中q->next=p;表示什么意思?
2021-05-19 11:03:37q->next = p; 表示将节点p加入到节点q之后。意思:使当前指针指向链表的下一个结点。一般作用在数据结构中的单链表里由...->是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。... -
C语言中->是什么意思啊?比如说 p=p->next 到底表达了什么意思,请说清楚点,还有->这个符号是一个整体吗,...
2018-08-01 10:03:00换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.举个例子:struct Data{ int a,b,c;}; /*定义结构体*/struct Data * p;/*... -
-> 在c语言中是什么意思?
2020-10-31 14:31:44换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。 举个栗子: 问题中的p=p->a,意思是将p指向的一个结构体实例中的自... -
c语言L->length与L.length
2018-10-08 08:44:19C语言中, -> 是指针操作符, 点是结构操作符。 如果 L 是一个结构实例的指针,要用 -> 访问结构里的变量,而不能用点。 如果L 是一个结构的实例而非指针,只能用点而不能用 -> 。 L-&... -
C语言/数据结构中“a->b“、“a.b“是什么意思?
2021-06-17 10:38:09与之对应的,引用结构体成员的标记形式也有两种, 分别用运算符“.”“->”来标记。 ①由结构体变量名引用其成员的标记形式为: 结构体变量名.成员名 ②由指向结构体的指针变量引用结构体成员的标记形式: 指针变量... -
C语言:结构体中(.)和(->)的区别
2020-12-14 14:24:10首先,要了解 (*a).b 等价于 a->b。 概念上: 一般情况下用“.”,只需要声明一个结构体。格式是,结构体类型名+结构体名。然后用结构体名加“.”加域名就可以引用域 了。因为自动分配了结构体的内存。... -
C语言中“.”与->的区别
2018-04-30 15:26:39写过C语言的各位朋友刚开始的时候一定受过这俩个混淆的坑吧。 看着感觉这俩个差不多啊,都是可以指向一个结构体的元素。但是,往往我们写的时候感觉错误百出: 下面我指出这俩个混淆的错误: 代码附上: 在上... -
-> 在c语言中是什么意思?
2018-05-11 20:53:30在c语言中是什么意思?检举->在C语言中称为间接引用运算符,是二目运算符,优先级同成员运算符“.”。 用法: p->a,其中p是指向一个结构体的指针,a是这个结构体类型的一个成员。表达式p->a... -
C语言中的指向运算符:->
2020-07-25 09:18:45使用方法:C语言允许把(*p).name用p->name代替,都表示p所指向的结构体变量中的name成员。 常见错误:1、*p.name,“.”运算符的优先级别高,所以*p一定要用括号。2、*p->name,*p是指针p指向的对象,指向... -
c语言中指针中 -> 和 。的区别?
2017-09-12 15:40:38c语言中指针中 -> 和 。的区别? -
c语言中的->代表什么意思
2013-09-13 14:05:00c语言中 ->符号是什么意思? 比如c=a->b a为结构体或联合体的指针,->表示调用其成员 转载于:https://www.cnblogs.com/seasonsstory/p/3319072.html -
p=p->next 表达了什么意思
2018-04-25 18:12:45换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.举个例子:struct Data{int a,b,c;}; /*定义结构体*/struct Data * p... -
C语言中点操作符(.)和箭头操作符(->)
2019-02-01 11:07:00C语言中点操作符(.)和箭头操作符(->) 点说语法不太准确,许多都称该之为点运算符/操作符,箭头运算符/操作符。但是OC中叫点语法,感觉理解起来还蛮舒服。毕竟基础的C操作符中是 相同点 两个都是二元操作符,... -
C 语言结构体之点运算符( . )和箭头运算符( -> )的区别
2016-04-13 20:05:12),时而是用箭头运算符( -> );那么这两者之间的使用有什么区别么? 相同点:两者都是二元操作符,而且右边的操作符都是成员的名称。 不同点:点运算符( . )的左边操作数是一个结果为结构的表达式; 箭头运算符( ... -
C语言中位操作符(1)-计算机中的整数表示方法
2021-05-22 01:56:14写在前面长久以来,位操作符一直困扰着我,为什么呢?因为其虽易用,但是我自己却理解不透彻,用着总觉得有隐患?...写着写着有些太多,故而分两次写完吧,本次只讨论计算机中整数的表示方法。计算机中数字的... -
C语言-数据结构-列表
2021-03-09 10:23:03if ( ret ) { if ( pos > list->length) pos = list->length; for (i=list->length; i>pos; i--) list->node[i] = list->node[i-1]; list->node[i] = c; list->length++; } ... -
C语言汉诺塔问题详解
2021-11-29 11:19:18即将A柱子上全部的环通过C柱子(C柱子作为中介)移动到B柱子上 当A只有一个环的时候: A->B 当A只有两个环的时候: A->C A->B C->B 当A只有三个环的时候: A->B A->C B->C A->B C->A C->B A->B 思路: 1、将... -
啥是c语言-c语言感叹号用法-c语言中的/和%表示什么意思
2020-12-24 04:25:05“!”逻辑非运算符,逻辑操作符一般将其操作数视为条件表达式,返回结果为Bool类型:*“!true”表示条件为真(true)。*“!false?...C语言运算符:是说明特定操作的符号,它是构造C语言表达式的... -
c语言---c语言中的斐波那契数列程序
2022-03-12 14:00:57c语言中的斐波那契数列编程问题(兔子繁衍、走台阶)递归思想 -
c语言--两个叹号连用
2017-09-19 16:54:00感叹号是运算符,逻辑非。比如说“!真”也就是假的意思。 ...是为了把非0值转换成1,而0值还是0...因为C语言中,所以非0值都表示真。所以!非0值 = 0,而!0 = 1。 所以!!非0值 = 1,而!!0 = 0。 比如:i=5 !i=0 !!i=1 -
C语言学习:平方-->乘方(m的n方)
2016-09-11 19:59:56直接用两个数(或变量)相乘就可以表示平方,比如x*x不过如果,需要求m的n次方,就需要用到pow(x,y)乘方(包括开方)这个库函数了,使用pow(x,y)这个库函数,需要math.h头文件 其中x和y都是双精度浮点(double)型 -
C语言-1(第一天学C语言)
2021-04-04 22:37:51第一天学c语言## c语言-1 #include<stdio.h> int main() { printf("shabi\n"); return 0; } main有且仅有一个 #include<stdio.h> int main() { int age = 20; printf("%d\n", age);//%d---... -
C语言中 “>>=,,&=,^=,|=” 分别表示什么意思? 举例说明
2020-12-11 10:45:391、C语言中的 >>= 意思为:右移后bai赋值 代码示例为: x = 8; x >>=3; 右移后结果为:00000000000000000000000000000001 2、C语言中的<<= 意思为:左移后赋值 代码示例为: x = 8; x &...