一、结构体基础

    1、定义:结构体大大加强了C的数据聚合能力,可以使得不同类型的数据进行结合

    2、特征:

      1)、结构体可以使得不同类型的数据进行结合

      2)、结构体可以使用内置的数据类型,包括指针

      3)、结构体可以使用自定义的数据类型,甚至自身(必须是命名结构体)

      4)、结构体成员的访问通过成员访问符号'.',若是结构体指针时,访问成员变量时可以使用->

      5)、结构体的普通定义

      6)、结构体的类型定义

      7)、结构体指针的定义及应用

      8)、结构体的大小

      9)、结构体其他
      

    3、基本定义及应用:

  #include <stdio.h>
#include <string.h> int main(int argc, char **argv)
{
struct _person{
char firstName[];
char lastName[];
char title[];
int age;
}; struct _person person1;
strcpy(person1.firstName, "guo");
strcpy(person1.lastName, "zhumulama");
strcpy(person1.title, "study hard every day!");
person1.age = ; printf("usual struct define:\n");
printf("The person1 info:\n firstName: %s\n lastName: %s\n title: %s\n and age: %d\n", person1.firstName, person1.lastName, person1.title, p erson1.age); typedef struct person{
char firstName[];
char lastName[];
char title[];
int age;
} Person; Person person2;
strcpy(person2.firstName, "zhang");
strcpy(person2.lastName, "hangchao");
strcpy(person2.title, "study hard every year!");
person2.age = ; printf("typedef struct define:\n");
printf("The person2 info:\n firstName: %s\n lastName: %s\n title: %s\n and age: %d\n", person2.firstName, person2.lastName, person2.title, p erson2.age); return ;
}

    代码说明:

      1)、第6-11行代码是结构体的普通定义

      2)、若使用普通定义,声明结构体的方式如13行所示

      3)、第22-27行代码是结构体的类型定义
      
      4)、若使用类型定义,声明结构体的方式如29行所示

      5)、第20行和36行,演示了结构体成员的访问;

      6)、一般情况下,使用结构体的类型定义比较方便;

    4、结构体指针及结构体成员指针的应用:

  #include <stdio.h>
#include <string.h>
#include <stdlib.h> int main(int argc, char **argv)
{
typedef struct _person{
char *firstName;
char *lastName;
char *title;
int age;
} Person; Person person1;
person1.firstName = (char *)malloc(strlen("zhang") + );
strcpy(person1.firstName, "zhang");
person1.lastName = (char *)malloc(strlen("hangchao") + );
strcpy(person1.lastName, "hangchao");
person1.title= (char *)malloc(strlen("study hard every year!") + );
strcpy(person1.title, "study hard every year!");
person1.age = ; printf("The person1 info:\n firstName: %s\n lastName: %s\n title: %s\n and age: %d\n", person1.firstName, person1.lastName, person1.title, person1.age);
printf("\n"); Person *ptrPerson = (Person *)malloc(sizeof(Person));
(*ptrPerson).firstName = (char *)malloc(strlen("wangu") + );
strcpy((*ptrPerson).firstName, "wangu");
(*ptrPerson).lastName = (char *)malloc(strlen("chaohang") + );
strcpy((*ptrPerson).lastName, "chaohang");
(*ptrPerson).title= (char *)malloc(strlen("study hard every dayd!") + );
strcpy((*ptrPerson).title, "study hard every dayd!");
(*ptrPerson).age = ; printf("The (*ptrPerson). info:\n firstName: %s\n lastName: %s\n title: %s\n and age: %d\n", (*ptrPerson).firstName, (*ptrPerson).lastName, (*ptrPerson).title, (*ptrPerson).age);
printf("\n"); Person *ptrPerson1 = (Person *)malloc(sizeof(Person));
ptrPerson1->firstName = (char *)malloc(strlen("wangu") + );
strcpy((*ptrPerson1).firstName, "wangu");
ptrPerson1->lastName = (char *)malloc(strlen("chaohang") + );
strcpy((*ptrPerson1).lastName, "chaohang");
ptrPerson1->title= (char *)malloc(strlen("study hard every dayd!") + );
strcpy((*ptrPerson1).title, "study hard every dayd!");
ptrPerson1->age = ; printf("The ptrPerson1-> info:\n firstName: %s\n lastName: %s\n title: %s\n and age: %d\n", ptrPerson1->firstName, ptrPerson1->lastName, ptrPerson1->title, ptrPerson1->age);
printf("\n"); return ;
}

    代码说明:

      1)、第7-12行代码是结构体的类型定义,结构体成员为指针变量

      2)、第14行声明结构体变量

      3)、第15,17,19行代码是结构体变量成员分配内存
      
      4)、第16,18,20行代码是结构体变量成员赋值内容

      5)、第23行,演示了结构体成员的访问;

      6)、第26行和38行声明结构体指针变量;

      7)、第26行和38行为结构体指针变量申请内存;
      
      8)、第35行代码是结构体指针变量访问方式,使用(* structName).是结构体指针访问成员的老式方法,现在基本不用;

      9)、第47行代码是结构体指针变量访问方式,使用structName->是结构体指针访问成员的新式方法,现在用的比较频繁;

35深入理解C指针之---结构体基础的更多相关文章

  1. C++指针和结构体基础知识

    学习C++首先要回忆起C语言当中的指针和结构体知识,本文作者将通过一段代码来总结指针和结构体基础知识:指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使 ...

  2. 36深入理解C指针之---结构体的内存处理

    一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...

  3. 37深入理解C指针之---结构体与指针

    一.结构体与指针 1.结构体的高级初始化.结构体的销毁.结构体池的应用 2.特征: 1).为了避免含有指针成员的结构体指针的初始化复杂操作,将所有初始化动作使用函数封装: 2).封装函数主要实现内存的 ...

  4. 深入理解C指针之六:指针和结构体

    原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...

  5. c语言指针与结构体

    #include <stdio.h> #include <stdlib.h> struct mydata { int num; ]; }; void main1() { /*i ...

  6. Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

    Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...

  7. 【阅读笔记】《C程序员 从校园到职场》第七章 指针和结构体

    原文地址:让你提前认识软件开发(13):指针及结构体的使用 CSDN博客 https://blog.csdn.net/zhouzhaoxiong1227/article/details/2387299 ...

  8. C++ 利用指针和数组以及指针和结构体实现一个函数返回多个值

    C++ 利用指针和数组实现一个函数返回多个值demo1 #include <iostream> using namespace std; int* test(int,int,int); i ...

  9. C语言--- 高级指针2(结构体指针,数组作为函数参数)

    一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[ ...

随机推荐

  1. 代码块(block)的使用

    Objective-C语法之代码块(block)的使用 代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱 ...

  2. [提供可行性脚本] RHEL/CentOS 7 多节点SSH免密登陆

    实验说明: 在自动化部署时,会经常SSH别的机器去操作,然而每次的密码认证却很令人烦躁,尤其是很长的密码,因此SSH免密登陆就显得必不可少: 在机器数目很多的时候,使用更过的往往是Ansible分发并 ...

  3. 在物理机上,用U盘安装esxi虚拟化环境

    一般使用U盘安装centos镜像,可使用镜像刻录工具UltraISO,详细方法参照如下链接: https://jingyan.baidu.com/article/647f0115ee55ba7f214 ...

  4. wdcp 使用说明总结(持续更新中。。。)

    wdcp 使用说明总结(持续更新中...) 1.移动文件时,如果是上一层,直接填写../即可

  5. Python入门基本语法

      Python入门 以下主要讲述Python的一些基础语法,包含行的缩进在python中的重要意义,python中常见的保留字和引号的使用,如何实现单行注释和多行注释. print("he ...

  6. Java策略模式(Strategy)

    一.定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.策略模式使这些算法在客户端调用它们的时候能够互不影响地变化.(Java的TreeSet集合中,构造方法可传入具体的比较器对象以实现 ...

  7. win7下设置git客户端

    msysgit官网: http://msysgit.github.io/ 下载msysgit http://msysgit.googlecode.com/files/Git-1.8.5.2-previ ...

  8. Android后台的linux一直保持唤醒状态,不进入睡眠

    由于要做Android手机的电池续航测试,是不能插usb的,所以把case放到sh文件中,之后push到手机里,执行的. 但是出现个问题,假如case中有很长时间的sleep操作,关闭手机屏幕,这样l ...

  9. Android兼容性测试CTS --环境搭建、测试执行、结果分析

    为了确保Android应用能够在所有兼容Android的设备上正确运行,并且保持相似的用户体验,在每个版本发布之时,Android提供了一套兼容性测试用例集合(Compatibility Test S ...

  10. kettle-批量同步表数据

    一.实验目标 利用kettle实现从mysql数据库中的dbf库批量同步表到dbm库(全量同步) 二.实验环境 dbf  库中表f1.f2.f3  .f1中1条数据,f2中100条数据,f3中2条数据 ...