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)宇 ...
随机推荐
- 9.python中sys.argv[]用法说明
在python中sys.argv[]是用来获取命令行输入的参数的(参数和参数之间空格区分),sys.argv[0]表示代码本身文件路径,所以从参数1开始,表示获取的参数了 举例说明:创建一个程序名为t ...
- PPP协议 PAP认证
- 在nginx服务器里面搭建好node.js本地服务器后,利用Node.js的FS模块,实现简单数据的写入和读取
先在server.js里面引入: var fs = require('fs'); 然后写入 // 往writeme.txt文件 写入一些内容 fs.writeFile('./writem ...
- Springboot Jackson配置根本方案, 日期格式化, 时区设置生效
当项目集成配置的功能越来越多, 说不准哪个配置就影响到了什么. 比如你启用了EnableMvC, 默认配置文件配置的一些文件就失效了. 虽然约定大于配置,让springboot可以极简化构建, 但不熟 ...
- springmvc接收json数据的常见方式
经常使用Ajax异步请求来进行数据传输,传的数据是json数据,json数据又有对象,数组.所有总结下springmvc获取前端传来的json数据方式:1.以RequestParam接收前端传来的是j ...
- static和final关键字
static关键字 静态变量 静态变量:又称做类变量,也就是这个变量属于整个类,而不属于单个实例.类所有的实例共享静态变量,可以直接通过类名来访问它.静态变量在内存中只存在一份,当系统第一次加载类时, ...
- Jquery实现图片管理
这里实现的是一个图片的在线管理,类似于网络相册的图片管理. 效果图如下: 文件结构如下图: style2.css文件内容如下: @charset "utf-8"; *{;; } i ...
- TensorFlow——dropout和正则化的相关方法
1.dropout dropout是一种常用的手段,用来防止过拟合的,dropout的意思是在训练过程中每次都随机选择一部分节点不要去学习,减少神经元的数量来降低模型的复杂度,同时增加模型的泛化能力. ...
- python封装简介
1.效果图: 对比一: 对比二: 2.学习来源代码: # 封装是面向对象的三大特性之一 # 封装指的是隐藏对象中一些不希望被外部所访问到的属性或方法 # 如何隐藏一个对象中的属性? # - 将对象的属 ...
- hive 动态分区
非常重要的动态分区属性: hive.exec.dynamic.partition 是否启动动态分区.false(不开启) true(开启)默认是 false hive.exec.dynamic.pa ...