C语言:结构体指针

 

目录

1:结构体指针的定义和访问其实和普通的指针一样:

1.1直接定义指针并赋值:

1.2让指针指向一个malloc空间再赋值:

1.3让指针指向malloc了n个sizeof( )空间再赋值:

2.使用结构体指针注意点:

2.1.如果用结构体指针,就不能用(点运算符)访问结构体中的变量,要用 ->

 

2.2.指针要注意是否是野指针或者NULL,非法内存,会段错误,使用前要malloc

 

2.3.如果结构体指针发生偏移。则是偏移整个结构体的大小。

 

2.4.给数组赋值字符串,用strcpy( ) 。

3.详细代码如下:


1:结构体指针的定义和访问其实和普通的指针一样:

         类比如下:

                      类型                    变量名

        普通指针:    char                    *p;

        结构体指针:struct Student    *p;

 

给下面3个小点的结构体指针的定义​​​​先定义一个结构体:

struct Student {

char name[128];

int score;

};

1.1直接定义指针并赋值:

char  *p = {abcdef};                           

        struct Student  *p = {"张三",100};

1.2让指针指向一个malloc空间再赋值:

            char  *p = (char *)malloc(sizeof(char));                           

            struct Student  *p = (struct Student *)malloc(sizeof(struct Student));

     p.name = "张三";

     p.score = "100";

1.3让指针指向malloc了n个sizeof( )空间再赋值

             char  *p = (char *)malloc(n * sizeof(char));     //相当于字符串数组            

             strcpy(p,"abcdef");

 

             struct Student  *p = (struct Student *)malloc(n * sizeof(struct Student));  //相当于数组,数组里的每一个元素存放着一个结构体,malloc也是一种定义数组的方式

     p[0].name = "李四";

     p[0].score = "99";

     p[1].name = "王五";

     p[1].score = "88";

不写了,想表明的意思就是相当于一个数组来使用,实际使用for循环遍历一下就好啦。

2.使用结构体指针注意点:

2.1.如果用结构体指针,就不能用(点运算符)访问结构体中的变量,要用 ->

比如:stu.score = 50;    变成      stu->score = 50;

 

2.2.指针要注意是否是野指针或者NULL,非法内存,会段错误,使用前要malloc

比如:struct Student *p;(野指针)    或      struct Student *p = NULL; 

 

2.3.如果结构体指针发生偏移。则是偏移整个结构体的大小。

struct Student
      {
             char name[128];       
              int score;
      };

struct Student *p = {"李四",100};

如果这个结构体发生指针的偏移p++,则是char name[128] 有128位 加上 int score 有4位,一共偏移了132位字节。

 

2.4.给数组赋值字符串,用strcpy( ) 。

char name[128];

strcpy(name,"abcedf");

相当于:char name[128] = "abcedf";

3.详细代码如下:

#include <stdio.h>
#include <stdlib.h>

struct Student
{
	char name[128];
    int score;
};

int main()
{
	struct Student stu;

    strcpy(stu.name,"张三");
   	stu.score = 50;	
    printf("名字:%s,分数:%d\n",stu.name,stu.score);

    puts("==================================================================");
    
    struct Student *p;    //野指针
    //p.score = 100;      //如果用结构体指针,就不能用点运算符访问结构体中的变量,要用->
    p = (struct Student *)malloc(sizeof(struct Student));
    p->score = 100;
    strcpy(p->name,"李四");
    printf("名字:%s,分数:%d\n",p->name,p->score);
    
    free(p);             //malloc的空间被释放,这样malloc的空间不会因为下一行p = &stu;而被弃用造成内存泄漏
    p = &stu;            //指针是存放地址的变量,之前指向malloc的那块空间,现在指针变量存放的是stu的地址
    printf("名字:%s,分数:%d\n",p->name,p->score);

    puts("===================================================================");
        
	printf("地址是:%p\n",p++);	//p++指针偏移了一个空间的大小,128+4 = 132位
    printf("地址是:%p\n",p);		
        
	system("pause");
	return 0;
}

 

  • 26
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枕上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值