博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言中和指针相关的四道题目
阅读量:6268 次
发布时间:2019-06-22

本文共 1475 字,大约阅读时间需要 4 分钟。

例子1.

void fun (int *x , int *y) {

  printf("%d, %d", *x, *y) ;
  *x = 3;
  *y = 4;
}

main()

{
int x = 1, y = 2
fun(&y, &x);
printf("%d, %d", x, y);
}

结果
2, 1
4, 3

注意main在调用fun函数时, y 和x故意写颠倒了。

 --------------------------------------------------------------

例子2. 

#include <stdio.h>

void swap(int *p1, int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}

main()

{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

如果在控制台输入  2 和 5

则输出结果为 

5, 2

原因: 在调用swap函数时使用了职称,所以在swap函数内部对p1,p2 所引用的内容值的修改,会影响外面的a和b的值。

 --------------------------------------------------------------

例子3:

#include <stdio.h>

void swap(int *p1, int *p2)
{
int *temp;
temp = p1;
p1 = p2;
p2 = temp;
}

main()

{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

和2不同, swap函数中的temp为指针,temp=p1使得temp指向了2,p1=p2使得p1指向了5,p2=temp使得p2指向了5.

但最后的打印结果仍为

2,5

原因是:虽然main中调用swap函数时使用了指针传递,但swap函数中的所有操作都是:将指针本身的修改,而没有再次使用*操作符来修改“指针指向的内容值”

---------------------------------------------------------------------

例子4:

#include <stdio.h>

void swap(int *p1, int *p2)
{
int *temp;
*temp = *p1;
*p1 = *p2;
*p2 = *temp;
}

main()

{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

和2很像。但唯一不同是,temp定义为指针而不是普通变量。看上去似乎应该和2的输出结果一样,仍为

2,5 。

但实际运行时编译器会报错:非法的内存写入。

原因是:temp为野指针,并没有预订指向哪里。如果指向系统区,则可能导致操作系统死机。

如果temp在定义后,马上给一个初始值,就不会有问题了。

转载于:https://www.cnblogs.com/kungfupanda/p/4162040.html

你可能感兴趣的文章
Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 2)
查看>>
通过kafka提供的命令来查看offset消费情况
查看>>
oracle数据库从入门到精通之四
查看>>
自定义圆形图片控件
查看>>
sharepoint 2013 补丁升级步骤
查看>>
asp.net core 2.0 web api基于JWT自定义策略授权
查看>>
Skype for Business Server 2015-04-前端服务器-3-安装-管理工具
查看>>
第12章代码《跟老男孩学习Linux运维:Shell编程实战》
查看>>
我们为什么从Python转到go?
查看>>
5.Azure负载均衡(上)
查看>>
轻松精通awk数组企业问题案例
查看>>
26.Azure备份服务器(下)
查看>>
从“网上说的能信么”说开去---学习的思考
查看>>
DHCP 日志分析
查看>>
.NET Micro Framework动态调用C/C++底层代码(原理篇)
查看>>
Windows Server 2012正式版RDS系列⒃
查看>>
Shell脚本之awk篇
查看>>
微软发布Azure Stack硬件需求
查看>>
python socket编程详细介绍
查看>>
Windows Server 2016第三个技术预览版新技术
查看>>