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)宇 ...
随机推荐
- Oracle数据库连接工具的使用(三)
一.PL/SQL Developer介绍 1.简介 PL/SQL Developer是一个集成开发环境,专门开发面向Oracle数据库的应用.PL/SQL也是一种程序语言,叫做过程化SQL语言(Pro ...
- 12款好用的Visual Studio插件,最后一款良心推荐
目录 01 CodeMaid 02 Markdown Editor 03 ReSharper 04 GitHub Extension for Visual Studio 05 ZenCoding 06 ...
- 这份前端面试小册子dog cheng带来啦~
写在前面 没有错,就是我啦dog cheng,好久不见,从17年在博客园写下第一篇文章,转身间已然两年,从大二到现在的大四预备毕业生,我仍然在这条道路上前进.秋招早已经结束,在拿到用友,滴滴的offe ...
- 2019牛客暑期多校第一场题解ABCEFHJ
A.Equivalent Prefixes 传送门 题意:给你两个数组,求从第一个元素开始到第p个元素 满足任意区间值最小的元素下标相同的 p的最大值. 题解:我们可以从左往右记录到i为止每个区间的最 ...
- Markdown 复杂公式&常用符号
公式格式 行内公式 行内公式(不会换行)使用 $ 作为起止符,例如:$a + b = c$, 效果为:\(a + b = c\) 块级公式 块级公式(单独一行)使用 $$ 作为起止符,例如:$$a + ...
- infer 代码静态分析
infer 代码静态分析 静态代码分析工具,主要是为了提高我们的代码质量. 通常,我们提高代码质量的方式是通过CodeReview,但是这个过程耗费的人工和时间往往较大.并且随着代码量的增加人肉检测起 ...
- 用PHP写下HELLO WORLD!
一.选择PHP开发工具 1.phpstorm最新版本 2.打开phpstorm界面 按create键,选择new window ,出下如下页面: 鼠标放在文件夹上,右键单击,弹出以下对话框:做如下操作 ...
- Xadmin的实现
一.启动 1.前提 配置setting.py文件 INSTALLED_APPS 2.定位Xadmin,找到对应的类 'Xadmin.apps.XadminConfig', 3.根据admin源码,实现 ...
- hdu4841
今天天气确实很好! 接下来是圆桌问题,顺便做个vector容器的笔记方便以后复习.嘿嘿 Problem Description圆桌上围坐着2n个人.其中n个人是好人,另外n个人是坏人.如果从第一个人开 ...
- 玩转Django2.0---Django笔记建站基础五(模板)
第五章 模板 Django作为web框架,需要一种很便利的方法去动态地生成HTML网页,因此有了模板这个概念.模板包含所需HTML的部分代码以及一些特殊语法 Django可以配置一个或多个模板引擎(甚 ...