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)宇 ...
随机推荐
- 机器学习之路--seaborn
seaborn是基于plt的封装好的库.有很强的作图功能. 1.布局风格设置(图形的style)and 细节设置 用matplotlib作图: import numpy as np import ma ...
- EF 学习系列二 数据库表的创建和表关系配置(Fluent API、Data Annotations、约定)
上一篇写了<Entity Farmework领域建模方式 3种编程方式>,现在就Code First 继续学习 1.数据库表的创建 新建一个MVC的项目,在引用右击管理NuGet程序包,点 ...
- UGUI ScrollView中显示模型和特效
游戏开发中有时候会遇到在UI上显示模型和特效的需求,这次需要在ScrollView上显示.我们使用UGUI的Screen Space - Camera模式,修改模型和特效的layer使之显示在UI上面 ...
- YOLOv3 K-means获取anchors大小
YOLOv1和YOLOv2简单看了一下,详细看了看YOLOv3,刚看的时候是蒙圈的,经过一番研究,分步记录一下几个关键的点: v2和v3中加入了anchors和Faster rcnn有一定区别,这个a ...
- struct结构体 重载运算符
struct node{ int x,y,z; }; bool operator<(node a,node b) { if(a.x!=b.x) return a.x<b.x; if(a.y ...
- cf 450b 矩阵快速幂(数论取模 一大坑点啊)
Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, ple ...
- Selenium的简单使用
selenium的使用对于新手来说十分友好,因为他避开了如今网络中的异步加载抓取的困扰,使得我们大部分的时间可以用于提取信息和存储中,下面就简单的列一些使用的代码,希望给同样初学的你有一定的参考价值. ...
- 【转】document.form.action,表单分向提交
document.form.action,表单分向提交,javascript提交表单 同一个表单可以根据用户的选择,提交给不同的后台处理程序.即,表单的分向提交.如,在编写论坛程序时,如果我们希望实现 ...
- 废旧手机改造之给你的手机安装win10系统
最近又开始琢磨把我这个即将退出的二手手机再利用一下 发现了一个不错的软件 先上图 是不是感觉逼格很高啊 点击下面链接即可下载使用 https://www.lanzous.com/i4gpsib 欢迎交 ...
- 智能指针shared_ptr使用学习
当需要shared_ptr实现向上向下转换时,可以使用 dynamic_pointer_cast 来进行转换 下面是例子: #include <memory> using namespac ...