基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。

有点生硬,对于java程序员来说,结构体就相当于java model

比如定义 person

class Person{string name;int arg;string cardId;
}

对于c来说要把这个对象用结构体来描述,表示具有这一特征的一种结构
struct Person{
char * name;
int age;
char * cardId;
}

结构体是一种构造数据类型,把不同的数据类型整合起来成为一个自定义的数据类型 有点类似于java对象

结构体与结构体变量

struct Man{char *name;  int age;
} man = { "Tom", 12};

结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&,所以给 p赋值只能写作:

struct Man * p= &man;

而不能写作:

struct stu *p= man;

结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。下面的写法是错误的,不可能去取一个结构体名的地址,也不能将它赋值给其他变量:

struct stu *pstu = &Man;
struct stu *pstu = Man;

需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储

初始化:

在定义结构体时候初始化

typedef struct Man{char name[20];int age;
}man ={"jack',20};

在使用时候初始化

 struct Man{char name[20];int age;
}man;void main (){//1man m1= {"lily",20};//2man m2;strcpy(m2.name,"rose");man m3  = {1, "wuli"};//可以初始化,设置i为1,s为一个字符串.man m4  = {1};//初始化个数少于实际个数时,只初始化前面的成员。man m5  = {.name="wuli"};//有选择的初始化成员。
}

结构体写法:

struct 结构体名{结构体所包含的变量或数组
};

声明struct新对象时,必须带上struct,即struct tagXX a;写成tagXX a的形式是错误的,但是在C++中却是可以的。

struct Man{char name[10];
};
void main(){struct Man m = {"jack"};//声明对象时需要带上struct
}

在声明类型的同时定义变量

struct 结构体名{结构体所包含的变量或数组
} 别名;
struct Man{char name[10];
}man;

直接定义结构体类型变量,匿名结构体

 struct {结构体所包含的变量或数组
} 别名;
struct{char name[10];
}man;

结构体嵌套:

struct Student{char name[20];
};
struct Person{char name[20];int age;struct Student s;
}
void main(){struct Student s1;strcpy(s1.name,"jack");struct Person p = {"lili",20,{"wuli"}};getchar();
}

结构体与指针

通过结构体指针可以获取结构体成员,一般形式为:

(*pointer).memberName

或者:

pointer->memberName

第一种写法中,.的优先级高于,(*pointer)两边的括号不能少。如果去掉括号写作*pointer.memberName,那么就等效于(pointer.numberName),这样意义就完全不对了。

第二种写法中,->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->在C语言中的唯一用途。(与java中 类.变量名 作用类似)

 struct Man{char name[10]; int age; } man = { "Tom", 12}, *p = &man;void main(){//读取结构体成员的值printf("姓名:%s,年龄:%d\n", (*).name,(*p).age);printf("姓名:%s,年龄:%d\n", p->name,p->age);getchar();
}

指针与结构体数组

 struct Man{char name[20]; int age; };
void main(){struct Man mans[] = {{"lily",20,},{"jack",19}};//遍历结构体数组struct Man *p = mans;int len = sizeof(mans) / sizeof(struct Man);//方法一for(;p<mans+len;p++){printf("%s,%d\n",p->name,p->age);}//方法二int i =0;for(;i<len;i++){printf("%s,%d\n",mans[i].name,man[i].age);}
}

结构体动态分配内存

void main(){struct Man * p =(struct Man*) malloc(sizeof(struct Man)*10);struct Man * p1 = p;//赋值p1->name ="jack";p1->age = 20;p1++;p1->name = "rose";p1->age =21;struct Man *loop_p= p;for(;loop_p<p+2;loop_p++){printf("%s,%d\n",loop_p->name,loop_p->age);}free(p);getchar();
}

[JNI] 开发基础(7)结构体相关推荐

  1. 原生Android开发基础项目结构介绍

    原生Android开发基础项目结构介绍 1.软件整体结构 2.具体的页面书写 3.实例分析 4.后续     下面先来总结一下软件的基本目录结构,这一般是开发的关键,只有明白了软件的目录结构,才能更加 ...

  2. java jni 结构体_JNI基础 -- C++基础知识(结构体共用体 )

    结构体 类似于Java中的Bean对象,可以将一些变量封装为一个结构体 声明结构体的关键字是struct,也可以通过typedef别名定义 举个栗子: struct Student { //不同的数据 ...

  3. c++ 结构体初始化_【干货】c语言基础语法——结构体

    1.关于C语言结构体的引入 学习环境搭建1_Linux C语言_嵌入式开发工程师-创客学院​www.makeru.com.cn 在实际问题中有时候我们需要几种数据类型一起来修饰某个变量. 例如一个学生 ...

  4. Android Studio1.4.x JNI开发基础 - 简单实例

    接上一篇,搭建好基于Android Studio的环境之后,编写native代码相对来说也比较简单了.在Android上编写Native代码和在Linux编写C/C++代码还是有区别,Native代码 ...

  5. Go语言基础之结构体

    转载地址:https://www.liwenzhou.com/posts/Go/10_struct/ Go语言中没有"类"的概念,也不支持"类"的继承等面向对象 ...

  6. Go 存储基础 — 内存结构体怎么写入文件?

    作者 | 奇伢       责编 | 欧阳姝黎 概述 讲了那么多存储的通用知识,从 Linux 的文件系统,块层,再到磁盘,都做了一些深入的分享.今天分享一个 Go 编程的使用技巧:怎么把内存的结构体 ...

  7. Android Studio1.4.x JNI开发基础-基本环境配置

    从Eclipse时代到Android Studio普及,开发工具越来越好用.早些时候还需要安装Cygwin工具,从Android Studio1.3以后,在Android 环境开发JNI程序搭建开发环 ...

  8. c语言把结构体首地址放入指针,C语言基础———指针,结构体指针,函数指针

    指针基础 一 指针就是地址,地址就是指针.指针存储的是内存的地址. 二 指针的定义 1.&表示取址运算符,&a 可以取到 a 在内存中的地址;打印地址的占位符为(%p),printf( ...

  9. 10.Go语言基础之结构体

    Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 ...

  10. 【Go】语法基础之结构体

    结构体的定义很简单: type Vertex struct {X, Y float64 } 可以理解为多个变量的集合. 结构体的使用: 1.直接使用: v := Vertex{1, 2} 或 var ...

最新文章

  1. maven热部署插件-jetty
  2. Fragment.setArguments()
  3. 计算机网络:第二章 物理层
  4. 【Android】dip、dp、sp、pt和px的区别
  5. 运行velocity的官方例子
  6. Socket程序从Windows移植到Linux下的一些注意事项
  7. java坐标移动题目case_用java怎样编写一个二维坐标平移程序
  8. STM32工作笔记0050---端口复用和重映射
  9. HDU-1087 Super Jumping! Jumping! Jumping!
  10. 使用whistle代理
  11. 解决JSP文件乱码问题
  12. mysql5.0基础语句_mysql基础语句
  13. 如何用HBuilderX把uni-app项目运行到微信开发者工具上
  14. 继勒索病毒“永恒之蓝”445端口被封之后,在公网实现smb文件共享
  15. 程序与数学:平方根计算与牛顿迭代法
  16. html中制作banner,css banner轮播图怎么做?
  17. 求两个数的最大公约数(辗转相减法)
  18. matlab图像区域填充的原理_MATLAB中怎么用fill填充指定区域?
  19. windows内存占用过高解决方法
  20. 应用案例 | 2014款宝马116i车偶尔冷车难起动

热门文章

  1. 【Gym-100513 K】Treeland【bfs序构造】
  2. 【2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)】Justified Jungle【树上思维题】
  3. 关于表数据同步使用update_time时的注意事项
  4. Hugging Face Course-Introduction学习小记 (part2)
  5. 三个点在同一个半圆的概率_圆形水池中的四只小鸭子出现在同一个半圆中的概率是?...
  6. pythonwhileelse,关于Python while语句的Else子句
  7. STM32 使用DMA+DAC+TIMER 输出正弦波
  8. ssl 1606 选课
  9. SqlServer 存贮过程操作类
  10. Gartner预测:2010年个人电脑销售增长两成