C语言笔记--传递结构指针以及值传递,址传递
#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语言笔记--传递结构指针以及值传递,址传递的更多相关文章
- C语言笔记 08_函数指针&回调函数&字符串&结构体&位域
函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: / ...
- C语言笔记 07_枚举&指针
emum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读. 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,--}; 举个例子,比如:一星期有 7 天,如果 ...
- c语言中的结构体为值类型,当把一个结构体赋值给另一个结构体时,为值传递
#include <stdio.h> int main() { struct person { int age; }; }; //值传递,将p1中所有成员变量的值赋值个p2中对应的成员变量 ...
- C语言笔记之结构体
结构的本质是C语言的一种数据抽象,通俗的说,是基本数据类型的重组. 为什么要重组呢?由于基本数据类型不够用了.为什么不够用了呢?由于须要的信息类型太多了. 这是一个非常大的话题.信息本来是没有什么类型 ...
- C语言笔记(结构体与offsetof、container_of之前的关系)
关于结构体学习,需要了解:结构体的定义和使用.内存对齐.结构体指针.得到结构体元素的偏移量(offsetof宏实现) 一.复习结构体的基本定义和使用 typedef struct mystruct { ...
- C语言学习014:结构化数据类型
struct的基本使用 #include <stdio.h> //定义数据结构 struct fish{ const char *name; const char *species; in ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- go中值传递、引用传递、指针传递的区别
go语言中的值类型: int.float.bool.array.sturct等 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数 声明一个值类 ...
- go语言之字符串、指针、数组、切片、结构struct、面向对象
一: 字符串 概述: Go 语言将字符串作为 种原生的基本数据类型,字 符串的初始化可以使用字符串字面量. (1)字符串是常量,可以通过类 数组 索引访问其字节单元,但是不能修改某个字节的值 (2)宇 ...
随机推荐
- ### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: cn.xiaojian.blog.po.BlogType and java.lang.String ### Cause: java.lang.IllegalArgumentException: ...
### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: cn.xiaoj ...
- Python基础(二):操作基本数据类型
Python是一门解释型语言,它的优势在于代码简洁,易于理解,可以通过大量已封装好的内建方法和第三方模块方法完成日常所需的操作. 字符串 索引 起始下标为0 (从前往后数),末尾下标为-1(从后往前数 ...
- Qt5学习(1)
1. In Qt, if you want to apply styles to the main window itself, you must apply it to its central ...
- spring boot学习笔记(1)
一.构建springboot项目 可以通过idea的springboot initialization来创建, idea的功能很强大,可以自己选择需要集成的插件. 完整的项目结构是这样的: DemoA ...
- MySQL保存 emoji 表情(微信昵称表情)
问题分析 在微信开发过程中,总是会遇到带有emoji表情昵称的微信用户无法自动登录的问题. 后台代码抛出类似下面的异常信息. java.sql.SQLException: Incorrect stri ...
- 【转】Zookeeper原理
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其 ...
- 【转】ArcGIS Server 站点架构-Web Adaptor
GIS 服务器内置了Web服务器,如果我想用我自己企业内部的服务器,该怎么做? 多个GIS服务器集群又如何做? …… 有问题,说明我们在思考,这也是我们希望看到的,因为只有不断的思考,不断的问自己为什 ...
- C# WPF 嵌入网页版WebGL油田三维可视化监控
0x00 楔子 最近做的一个项目,是一个油田三维可视化监控的场景编辑和监控的系统,和三维组态有些类似,不过主要用于油田上. 效果如下图所示: 首先当然是上模型,设计人员跟进. 有了相关的模型,使用我们 ...
- hadoop搭建
一.前期准备 1.1 静态ip,请查看虚拟机安装不放呢 1.2 hostname 以及 hosts文件修改 cat /etc/hostname 不同的机器设置不同的名字 cat /etc/hosts ...
- SPFA判负环模板
void DFS_SPFA(int u){ if(flag) return; vis[u]=true; for(int i=head[u];i;i=edges[i].nxt){ if(fl ...