#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#include <string.h>
typedef struct _accoutn {
char *name;//定义用户名
char *bankName;//定义银行名称
double limit;//定义银行卡额度
double Nowmoney;//定义现在银行卡金额
}Account;
double Getload(const Account *a){
return(a->limit - a->Nowmoney);//定义欠款金额的算法
}
int main()
{
Account p1;
/*printf("请输入您的账户名:", *p1.name);*/
p1.name = "胡66";
p1.bankName = "招商银行";
p1.limit = ;
p1.Nowmoney = ;//初始化信息,方法1。
/*Account p2; 这种定义变量,再赋值会报错,具体原因我还不清楚,看来自己定义的数据类型还是和系统自定义的数据类型有些不同!
 p2={ "小王","农业银行",50000,10000 }*/
    Account p2 = { "小王","农业银行",50000,10000 };//初始化信息方法2
  printf("双11,%s同学欠花呗%2lf元,下个月准备吃土!\n", p1.name, Getload(&p1));
  printf("双11,%s同学欠花呗%2lf元,下个月准备吃土!\n", p2.name, Getload(&p2));
}

----上面这种是已经初始化好的信息。下面附上动态输入,再打印出来的程序。

typedef struct _accoutn {
char *name;
char *bankName;
double limit;
double Nowmoney;
}Account;
double Getload(const Account *a){
return(a->limit - a->Nowmoney);//定义欠款金额的算法
}
int main()
{
Account p1;
printf("请输入您的账户名:");
p1.name = (char*)malloc();//为p1.name申请内存,申请完内存后,指针变数组。
scanf("%s", p1.name);
printf("请输入您的银行名称:");
p1.bankName = (char*)malloc();//为p1.bankName申请内存,申请完内存后,指针变数组。
scanf("%s", p1.bankName);
printf("请输入您的银行卡额度:");
scanf("%2lf", &(p1.limit));
printf("请输入您当前的银行卡金额:");
scanf("%2lf", &(p1.Nowmoney));
printf("双11,%s同学欠花呗%2lf元,下个月准备吃土!\n", p1.name, Getload(&p1));
}

-------------值传递与址传递

#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#include <string.h> void changeNum(int num) {
num=num+;
return num;
}
void changeNum2(int *num) {
*num=*num+;
}
int main()
{
int num = ;
int num2 = ;
//下面为值传递和值传递的区别,其根本上都是副本传递,只不过副本传递的功能不同
changeNum(num);//这里把num=9复制了一份,传递到这个方法中,changenum实际改变的是自己作用域里面的num值,与外面的num值无关
changeNum2(&num2);//这里也是传递了一份副本,把num2的地址复制了一份进去,然后改变的是这个地址的值,但是由于复制的地址可以找到
//num2,实际上在正在意义上改变了num2的值
printf("num的值为:%d\n",num);
printf("num2的值为:%d\n", num2);
}

运行结果

-------------------------------同样的值传递与址传递的用法在结构体中也一样道理,下面上代码:

#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#include <string.h> typedef struct _accoutn {
char *name;
char *bankName;
double limit;
double Nowmoney;
}Account;
double Getload2(Account a) {
a.bankName = "邮政银行";
return(a.limit - a.Nowmoney);
}
int main()
{
Account p2 = { "小王","农业银行",, };
printf("双11,%s同学欠%s %2lf元,下个月准备吃土!\n", p2.name,p2.bankName, Getload2(p2));//采用值传递,默认银行没有改变,仍为农业银行
}

#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#include <string.h> typedef struct _accoutn {
char *name;
char *bankName;
double limit;
double Nowmoney;
}Account;
double Getload( Account *a) {
a->bankName = "邮政银行";
return(a->limit - a->Nowmoney);//定义欠款金额的算法
}
int main()
{
Account p2 = { "小王","农业银行",, };
printf("双11,%s同学欠%s %2lf元,下个月准备吃土!\n", p2.name,p2.bankName, Getload(&p2));//址传递,默认银行改变
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

其实上面的其实很简单,就说明了一个问题,C语言中,无论通过值传递,还是值传递作为参数,实际上都是传递了副本值而已,改变的都是原值得副本文件。

但是最后实现得结果不一样其实是因为,值传递修改的是副本的值,与原值无关,所以原值不受影响。

而址传递呢,修改的也是原值地址的副本,但是由于地址只有一个,所以改变了副本地址所指向的值,原值也跟着改变了。

其实可以打个比喻说明值传递与址传递。

就比如你和你的好基友在互发一份学习文件,值传递就好比,你把这份文件直接复制了一份发给你的好友,你的好基友在这份文件做的一些笔记和你原本的那一份根本没有关系。

而址传递就好比你告诉你的好基友说:“我电脑上有一份学习资料,你要看,直接来我电脑看吧,我的电脑放我的3号课桌上了。”然后你的好基友打开了你的电脑,并且在这份文件上写了一些他的理解。所以文件就改动了。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

C语言笔记--传递结构指针以及值传递,址传递的更多相关文章

  1. C语言笔记 08_函数指针&回调函数&字符串&结构体&位域

    函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: / ...

  2. C语言笔记 07_枚举&指针

    emum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读. 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,--}; 举个例子,比如:一星期有 7 天,如果 ...

  3. c语言中的结构体为值类型,当把一个结构体赋值给另一个结构体时,为值传递

    #include <stdio.h> int main() { struct person { int age; }; }; //值传递,将p1中所有成员变量的值赋值个p2中对应的成员变量 ...

  4. C语言笔记之结构体

    结构的本质是C语言的一种数据抽象,通俗的说,是基本数据类型的重组. 为什么要重组呢?由于基本数据类型不够用了.为什么不够用了呢?由于须要的信息类型太多了. 这是一个非常大的话题.信息本来是没有什么类型 ...

  5. C语言笔记(结构体与offsetof、container_of之前的关系)

    关于结构体学习,需要了解:结构体的定义和使用.内存对齐.结构体指针.得到结构体元素的偏移量(offsetof宏实现) 一.复习结构体的基本定义和使用 typedef struct mystruct { ...

  6. C语言学习014:结构化数据类型

    struct的基本使用 #include <stdio.h> //定义数据结构 struct fish{ const char *name; const char *species; in ...

  7. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  8. go中值传递、引用传递、指针传递的区别

    go语言中的值类型: int.float.bool.array.sturct等 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数 声明一个值类 ...

  9. go语言之字符串、指针、数组、切片、结构struct、面向对象

    一: 字符串 概述: Go 语言将字符串作为 种原生的基本数据类型,字 符串的初始化可以使用字符串字面量. (1)字符串是常量,可以通过类 数组 索引访问其字节单元,但是不能修改某个字节的值 (2)宇 ...

随机推荐

  1. 你好,babel

    写在前面 其实学babel是本人2019年Q3的一个计划,因为当时自己做的一个项目需要自己去配babel,也遇到了一些困难,发现自己对babel的了解还是很少的,所以决定好好看下babel:可是后来解 ...

  2. SpringBoot系列之集成Dubbo示例教程

    一.分布式基本理论 1.1.分布式基本定义 <分布式系统原理与范型>定义: "分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统" 分布式系统(d ...

  3. mac使用python识别图形验证码

    前言 最近在研究验证码相关的操作,所以准备记录下安装以及使用的过程.虽然之前对验证码的破解有所了解的,但是之前都是简单使用之后就不用了,没有记录一个详细的过程,所以后面再用起来也要重新从网上查找资料比 ...

  4. 设置本地上网IP

    在局域网中,我们经常需要根据网络连接环境来对本地连接的IP地址进行手动设置,那么如何对IP地址进行设置呢?下面小编就把教程介绍给大家. 1. 右击桌面“网上邻居”->选择“属性”,打开“网络共享 ...

  5. spring boot介绍

    spring boot简介 1.spring boot是spring家族中的一个全新的框架,它用来简化spring应用程序的创建和开发过程,也可以说spring boot能简化我们之前采用ssm框架进 ...

  6. 快速开发一个npm包(轮子)

    动机 很多人都想写一个自己的轮子,可是开始动手的时候你总会遇到以下问题 一个基本的 js 库应该如何编写 基本的前端项目都要哪些文件 又要怎么打包发布到 npm 上 你的 es6 语法如何才能让别人识 ...

  7. 从头学pytorch(十六):VGG NET

    VGG AlexNet在Lenet的基础上增加了几个卷积层,改变了卷积核大小,每一层输出通道数目等,并且取得了很好的效果.但是并没有提出一个简单有效的思路. VGG做到了这一点,提出了可以通过重复使⽤ ...

  8. JAVA读取yml配置文件指定key下的所有内容

    先引入需要的依赖 <!--读取yml文件--> <dependency> <groupId>org.yaml</groupId> <artifac ...

  9. vue兄弟组件传值——事件总线

    1.创建一个js文件,例如msg.js,放到合适位置,例如components中,或者其他位置也行.然后在兄弟两个组件中分别引入msg.js文件 msg.js: import Vue from 'vu ...

  10. Rust入坑指南:海纳百川

    今天来聊Rust中两个重要的概念:泛型和trait.很多编程语言都支持泛型,Rust也不例外,相信大家对泛型也都比较熟悉,它可以表示任意一种数据类型.trait同样不是Rust所特有的特性,它借鉴于H ...