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 
#include 

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;
}

C语言:结构体指针_第1张图片

 

你可能感兴趣的:(C语言基础,指针,malloc)