关于C语言结构体,指针,声明的详细讲解。——Arvin

时间:2022-09-10 07:25:18
关于结构体的详细分析
  • 只定义结构体
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. 告诉编译器,这个名字已经被预定了,别的地方再也不能用它来作为变量名或对象名。

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

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

关于C语言结构体,指针,声明的详细讲解。——Arvin的更多相关文章

  1. C语言结构体指针(指向结构体的指针)详解

    C语言结构体指针详解 一.前言 一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组. *a).b 等价于 a->b. "."一 ...

  2. C&sol;C&plus;&plus;语言结构体指针的使用

    C/C++语言结构体指针的使用 主要内容 结构体的使用 - 定义,赋值,结构体指针 结构体作为函数参数的使用 指针的使用 代码内容重点 结构体的使用 - 定义,赋值,结构体指针 结构体作为函数参数的使 ...

  3. c语言结构体指针初始化

    今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...

  4. C语言结构体指针初始化(转)

    reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...

  5. c语言结构体指针必须初始化

    先说结论 结构体指针需要初始化 结构体指针的成员指针同样需要初始化 结构体变量定义的时候就已经分配了内存空间,而上面两个确没有 struct test{ int i; struct buf *p;} ...

  6. &lbrack;编程&rsqb; C语言结构体指针作为函数参数

    结构体指针作为函数参数:结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针.如果结构体成员较多,尤其是成员为数组时,传送的时间和空间 ...

  7. 结构体指针,C语言结构体指针详解

    结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针. 指向结构体变量的指针 前面我们通过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针. 前面讲过,& ...

  8. C语言结构体指针

    #include <stdio.h> int main() { /*************************************************** *结构体指针:指向 ...

  9. C语言 - 结构体&lpar;struct&rpar;比特字段&lpar;&colon;&rpar; 详细解释

    结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...

  10. C语言结构体指针的引用问题

    在写栈的一个应用时遇见这样的一个问题 SqStack s; s->base = (int*)malloc(sizeof(int)*10); 通过这样一个代码引用的时候,会导致程序出现异常 经过一 ...

随机推荐

  1. maven配置

    java 环境变理 http://jingyan.baidu.com/article/f96699bb8b38e0894e3c1bef.html maven环境变理 http://www.cnblog ...

  2. node&period;js整理 06异步编程

    回调 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了 function heavyCompute(n, callback) { var count = 0, i, j; for (i = ...

  3. 【原创】TP-LINK &plus;ASUS&lpar;Tomato&rpar; 双无线路由设置WDS

    主路由: TP-LINK TL-WR2041N 连接Internet,LAN IP地址:192.168.1.1,启用DHCP, 无线配置如下: 开启WDS功能,wireless为副路由的SSID,BS ...

  4. Bullcow 牡牛和牝牛(bzoj 3398)

    Description     约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡 ...

  5. Vue&period;js 2&period;x笔记:路由Vue Router(6)

    1. Vue Router简介与安装 1.1 Vue Router简介 Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,构建单页面应用. Vue Rout ...

  6. wordpress升级版本时出现错误&OpenCurlyDoubleQuote;Maximum execution time of 30 seconds exceeded”

    wordpress版本是4.9,之前升级5.0时就提示这个错误了,但因为我用的第三方主题,所以也没想去解决,也担心升级了wp版本后主题出问题. 现在wp版本已经到了5.2了,我闲着无聊就又点了升级,结 ...

  7. 【10-2】复杂业务状态的处理(从状态者模式到FSM)

    一.概述 我们平常在开发业务模块时,经常会遇到比较复杂的状态转换.比如说用户可能有新注册.实名认证中.已实名认证.禁用等状态,支付可能有等待支付.支付中.已支付等状态.OA系统里的状态处理就更多了. ...

  8. HGOI2010816 (NOIP 提高组模拟赛 day1)

    Day1 210pts(含T1莫名的-10pts和T3莫名的-30pts) 100+70+40=210 rank 29 这道题第一眼看是字符串匹配问题什么KMP啊,又想KMP不会做啊,那就RK Has ...

  9. npm的影武者 —— Npx

    npx github:https://github.com/zkat/npx 什么是Npx?它和npm是什么关系? 如果你把NPM升级到最新版本npm@5.2.0 ,它就会安装一个新的包npx $ n ...

  10. C语言支持的四种变量存储类型

    http://blog.csdn.net/zhandoushi1982/article/details/5425835 一)auto:auto称为自动变量(局部变量).局部变量是指在函数内部说明的变量 ...