如何正确使用指针?子函数能影响父函数的前提又是什么呢?

1,首先我们通过一个例子来说一下指针最基本的定义以及用法:
#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int *p = &a;
	*p = 100;//a = 100;
	p = &b;
	*p = 200;//b = 200;
	int **pp = &p;
	*pp = &a;//p = &a;
	**pp = 1000;//a = 1000;
	*pp = &b;//p = &b;
	**pp = 2000;//b = 2000;

	return 0;
}


通常情况下,"*"有三层意思(后面还会遇到不同的使用)定义指针;间接访问符(解引用);乘法;&a,取得a的地址,&是取地址符.

int *p = &a;所以,这一句的意思也就是,定义整形指针变量存放整型地址(指针)。其实,"指针==地址".
一般情况下,指针占四个字节,当然这取决于操作平台。在X86或者32位平台指针4字节,在X64或者64位平台指针8字节

2,接下来我们说一下子函数和父函数之间的调用关系:

程序一:

#include <stdio.h>
void swap_error1(int a,int b)
{
	int tmp;
	tmp=a;
	a=b;
	b=tmp;
}
int main()
{
	int a=10;
	int b=20;
	printf("%d,%d\n",a,b);
        swap_error1(a,b);
        printf("%d,%d\n",a,b);//10,20
	return 0;
}
程序二:

#include <stdio.h>
void swap_error2(int *p1,int *p2)//error.未使用解引用
{
	int *tmp;
	tmp=p1;
	p1=p2;
	p2=tmp;
}
int main()
{
	int a=10;
	int b=20;
	printf("%d,%d\n",a,b);
        swap_error2(&a,&b);//10,20
        printf("%d,%d\n",a,b);
	return 0;
}
分析:以上两个程序为什么最终都没有实现交换呢?


由上图我们可以看出:程序一,其实我们只是实现了子函数里的交换,并没有修改父函数中的值。因此,为了实现父函数值得交换,我们可以借用指针。那么就有了程序二的函数设计:定义三个指针变量,int *p1;int *p2;int *tmp;但是发现同样也没有实现值得交换。这又是为什么?

程序三:

#include <stdio.h>
void swap(int *p1,int *p2)//ok."传指针","解引用"缺一不可。
{
	int tmp=*p1;
	*p1=*p2;
	*p2=tmp;
}
int main()
{
	int a=10;
	int b=20;
	printf("%d,%d\n",a,b);
	swap(&a,&b);
        printf("%d,%d\n",a,b);//20,10
	return 0;
}

分析:程序三实现了函数值的交换,所以可以得出:子函数能修改父函数中的内容的前提是:"传指针,解引用".两者缺一不可。







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽宁工程技术大学 高级语言程序设计(C) 课程设计报告书 设计题目 : 电通讯录 2013年01月 目 录 一、引言…………………………………… 二、系统功能和原始数据……………………………………… 三、程序总体设计……………………………………………… 四、功能模块函数设计和调试 ……………………………… 五、程序清单…………………………………………………… 六、课程设计总结 …………………………………………… 一、引言 通过使用C语言编程实现通讯录管理系统的基本功能,并设计了简单的界面。该程序 主要使用的是数组的相关操作,包括结构体数组的输入、输出、查找、删除等。用到的 知识点是结构体类型定义结构提数组的的定义及应用。另外还用到了大量的自定义函数 。本人设计的这个通讯录系统也初步实现了人员信息的显示、删除、查找、添加等必要 的功能。 二、系统功能和原始数据 2.1 原始数据 录入内容包括ID号,姓名,性别,出生日期,固定电话号码,移动电话号码,QQ号码 ,电邮箱,通讯地址和邮编等。其中出生日期又包括年份,月份和日期三项。 2.2 系统功能 查找功能:能够提供检索除功能,他可以随心所欲的查找通讯录中任意一位朋友的详细 信息。通讯录结构中的许多项,都可以作为查找的线索,例如出生日期,邮编和姓名 。 自动排序功能:它能提供按姓名等排序的功能 纪录和读盘功能:在用户结束程序时,如果做了改动操作,程序会提示用户是否存盘。 三、程序总体设计和调试 3.1 总体设计:包括系统总体设计框架和系统功能模块图; 输入函数:用键盘输入朋友资料 写入文件:将信息写入指定文本文件 导出函数:将信息从文件中导出放在结构数组中 显示主菜单 浏览函数: 查询函数:按名字查询:输入名字显示对应的朋友资料 按出生日期查询:输入出生日期显示对应朋友资料 按邮编查询:输入邮编显示对应的朋友资料 删除函数:删除原有的朋友资料 3.2 详细设计: 1、主函数:main() 显示系统工作菜单,罗列该系统所有功能。先声明所有将会调用到的函数名。再运用选 择函数switch即可根据使用者所输入的功能代号进入对应的功能程序。亮点:定义一个 全局指针变量*p和全局变量a。其中a表示当前系统中职工人数,p指向a的地址,追 踪人数变化,这样在添加或者删除导致人数变化后,浏览函数display()能够正确显示出 当前人数的职工信息。宏定义define N指定首次输入的职工人数,可根据不同需要随时更改。 开始 显示菜单 输入功能代码 Switch(n) "调用输 "调用浏 "调用查 "调用删 "退出 " "入函数 "览函数 "询函数 "除函数 "exit() " "Input() "display() "search() "del() " " 结束 2、输入函数:void input() 定义一个结构struct employee和数组em[N]用来储存N个朋友的所有信息(ID号em[i].number,姓名em[i].na me,性别em[i].sex,生日em[i].birthday,电话em[i].phone,手机em[i].mobile,QQ em[i].qq,邮编em[i].zip)。通过for循环输入所有职工信息。用orintf语句提示需要 输入的内容,接着用scanf语句输入相应内容。输入完毕后套用保存函数save(N)将所有 输入信息写入指定文件。 3、保存函数:void save(int m) 定义文件指针fp,用fopen"只写"打开指定在D盘的"d://bbb.txt"文本文件。首先用if 语句判断文件是否打开成功,若fopen返回值不为0,则可继续下面操作。用for循环通 过fprintf语句将结构数组em中的内容写入保存在D盘的文本文件里面。形参m指需要写 入文件的职工人数。最后关闭文件。 4、导出函数:void load(int b) 首先判断fopen"只读"打开"d://bbb.txt"是否成功,若其返回值不为零,继续下面操 作。用for循环通过fscanf语句将文件中的朋友资料取出放到em结构数组里面。形参b指 需要导出的朋友。最后关闭文件。 5、浏览函数void display(int a) 声明整形变量i和b,其中i记录输出的朋友序数,b用来接收调用浏览函数时所传递过 来的实参,接着将其值传递给导出函数load(b),使得导出的朋友人数与浏览的朋友人数 保持一致。通过调用load函数后(即给em数组附值),用for循环输出每个朋友的各种信 息。 6、查询函数void search() 声明整形变量t,先用printf语句显示查询菜单,用scanf输入选择的查询方式代号, 用switch(t)进入所选择的具体查询函数,包括按出生日期查询、按姓名查

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值