关于结构体的详细分析
  • 只定义结构体
struct Student
{
int age;
char* name;
char sex;//结构体成员
};//(不要忘记分号)

Student是结构体的名字

  • 定义结构体变量

    struct Student stu1, stu2;
  • 定义结构体并同时定义结构体变量
struct Student{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;

关于指针的详细分析


1 #include <stdio.h>
2 #include <stdlib.h>
3 //关于指针的指针,赋值以及其意义
4 int main()
5 {
6 int a=8;//定义一个int型变量a,假设其在内存中的地址是1000
7 int *q;//定义指针变量q,q本身也需要内存存储,假设其地址是2000
8 q=&a;//给q赋值,即a的地址1000。此时q=1000,*q=a=8;
9 int **p;//定义指针的指针变量p,同理p也需要内存存储,假设其地址是3000
10 p=&q;//给变量p赋值,即q的地址2000.此时p=2000,*p=1000,**p=a=8
11 printf("%3d,%3d,%3d,%3d,%3d,%3d",a,q,*q,p,*p,**p);//输出值依次:8,1000,8,2000,1000,8
12 return 0;
13 }

定义指针变量:int *q;

定义指针的指针变量:int **p;

赋初值:*p=100;

关于int* p;int *p区别:

如果是c,我推荐int *p,*q,*x;这样的写法因为变量定义需要放在函数开始的地方.

如果是c++,我推荐

int* p = null;
int* q = null;

分行写并初始化,int* pint *p更容易区别类型和变量名

int* p强调类型是int指針,int *p强调对象是int指針

关于使用int* pint *p依个人口味,本人建议使用后者,有点像解方程,而且利于函数整体的结构和规范,前者容易有int* p,q;这种出错的可能性

关于声明和定义的详细分析

在C系列语言中,任何一个变量,总是要先声明,之后才能使用的。函数指针变量也应该要先声明。

变量的声明有两种情况:

  1. 一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
  2. 另一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。

声明是向编译器介绍名字--标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。

而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。

总之就是:把建立空间的声明成为“定义”,把不需要建立存储空间的成为“声明”。

基本类型变量的声明和定义(初始化)是同时产生的;而对于对象来说,声明和定义是分开的。

例如:类A

如果A a;就是一个声明,告诉编译器a是A类的一个对象变量,但是不进行初始化

如果以后a=new A();这就是初始化,分配了空间。

(我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。)

用static来声明一个变量的作用有二:

  1. 对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在。
  2. 外部变量用static来声明,则该变量的作用只限于本文件模块。

补充:

什么是定义?什么是声明?它们之间的区别是什么?

所谓定义就是(编译器)创建一个对象,为这个对象分配一块内存,并给它取上一个名字,这个名字就是就是我们经常所说的变量名或对象名。

声明有2重含义:

  1. 告诉编译器,这个名字已经匹配到一块内存上,下面的代码用到变量或者对象是在别的地方定义的。声明可以出现多次。
  2. 告诉编译器,这个名字已经被预定了,别的地方再也不能用它来作为变量名或对象名。

定义和声明的最重要区别就是:

定义创建对象并为这个对象分配了内存,声明没有分配内存。

最新文章

  1. Mysql 学习之基础操作
  2. Git 的详细使用
  3. js笔记——js里var与变量提升
  4. WebAPI接口调用身份验证
  5. MongoDB数据库基本用法
  6. HyperLink控件
  7. mac os 系统密码正确的 但是进不了系统
  8. 转:从零开始开发一款Android App (from 简书)
  9. 【转】如何从零开始学会 Ruby on Rails?
  10. FileUpload类别FileUpload1.FileName和FileUpload1.PostedFile.FileName差异
  11. java map集合的知识
  12. Leetcode刷题C#版之Toeplitz Matrix
  13. UNIX网络编程——解决TCP网络传输“粘包”问题
  14. my project 中git使用过程(基本操作流程)
  15. 洛谷P5289 [十二省联考2019]皮配(01背包)
  16. kaptcha验证码插件使用与参数
  17. js计算两个日期相差天数
  18. Quartz.Net分布式任务管理平台(续)
  19. XX-net
  20. MAC连接安卓手机通过adb指令安装apk

热门文章

  1. 07_编写天气预报和手机归属地的WebService
  2. 机器学习实战4:Adaboost提升:病马实例+非均衡分类问题
  3. CRM 2013 限制Lookup
  4. QT 网络编程
  5. JQuery常用方法一览
  6. JS表单验证
  7. [程序设计语言]-[核心概念]-02:名字、作用域和约束(Bindings)
  8. python之RabbitMQ
  9. Android first --- 单元测试框架junit
  10. 公钥私钥和RSA算法