您的位置:首页 > 其它

29-指针的练习(包含指针的使用场景)

2014-10-02 16:33 239 查看
本节知识点:

1、指针练习

2、指针的使用场景

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

1、指针练习

/*
使用函数来交换两个变量的值
*/
#include <stdio.h>
void swap(int p, int q)
{
int temp = p;
p = q;
q = temp;
}
void swap1(int *p, int *q)
{
// 这里temp是指针变量, 指针变量p和q传递进来, 赋值操作相当于改变指针的指向
int *temp = p; // temp指向p所指向的存储空间
p = q;         // p指向q所指向的存储空间
q = temp;      // q指向temp所指向的存储空间(即p所指向的存储空间)
}
void swap2(int *p, int *q)
{
// 这里temp是整型变量, 指针变量p和q传递进来, 通过*p和*q获取了它们所指向存储空间的变量值,因而可以改变变量的值, 完成值交换。
int temp = *p;
*p = *q;
*q = temp;
}
int main(int argc, const char * argv[])
{
// 定义两个整型变量a, b
int a = 10;
int b = 20;
// 打印a和b
printf("交换之前:a = %d, b = %d\n", a,  b);

// 1.调用swap函数
swap(a, b);
// 值传递无法改变函数外部的值, 因此无法使变量的值对换位置
printf("调用swap交换之后:a = %d, b = %d\n", a,  b);

// 2.调用swap1函数
swap1(&a, &b);
// 地址传递, 但是只是改变了指针指向, 没有改变所指向存储空间的内容
printf("调用swap1交换之后:a = %d, b = %d\n", a,  b);

// 3.调用swap2函数
swap2(&a, &b);
// 地址传递, 通过*p和*q完成了值交换
printf("调用swap2交换之后:a = %d, b = %d\n", a,  b);
}


输出结果:



注意:

(1)调用函数swap,属于值传递,在swap函数结束后,内存会释放,不会改变main函数中的a,b的值;

(2)调用函数swap1,属于地址传递,只是改变了指针变量的指向,并没有改变内存单元中的内容;

(3)调用函数swap2,属于地址传递,直接操作地址,改变了指针变量指向的内存单元中的内容(即a,b的值)。

2、指针的使用场景

(1)在函数中访问调用者中的变量



(2)函数返回多个值

#include <stdio.h>
// 定义一个函数,用于计算两个数的和、差、积、商、以及余数
void heAndChaAndJiAndShangAndYu(int num1, int num2, int *he, int *cha, int *ji, float *shang, float *yu)
{
// 将num1 + num2的结果赋值给指针变量he所指向的存储单元(即(num1 + num2)的结果的存储单元)
*he = num1 + num2;

// 将num1 - num2的结果赋值给指针变量cha所指向的存储单元(即(num1 - num2)的结果的存储单元)
*cha = num1 - num2;

// 将num1 * num2的结果赋值给指针变量ji所指向的存储单元(即(num1 * num2)的结果的存储单元)
*ji = num1 * num2;

// 将num1 / num2的结果赋值给指针变量shang所指向的存储单元(即(num1 / num2)的结果的存储单元)
*shang = num1 / num2;

// 将num1 % num2的结果赋值给指针变量yu所指向的存储单元(即(num1 % num2)的结果的存储单元)
*yu = num1 % num2;

}
int main (int argc, const char * argv[])
{
// 定义整型变量a,b并初始化为0,
int a = 0;
int b = 0;
// 定义整型变量he,cha并初始化为0,ji 初始化为-1
// 定义float类型变量shang,yu,并初始化为-1
int he = 0, cha = 0, ji = -1;
float  shang = -1, yu = -1;

// 提示用户输入两个整数,用逗号隔开
printf("请输入两个整数(用逗号隔开):\n");
// 接收用户输入的两个整数
// 此处整形变量前面一定要加取地址运算符&
scanf("%d,%d", &a, &b);

// 调用函数,计算和、差、积、商和余数,这时a,b的值分别传递到函数的形参num1,num2;
// he,cha,ji,shang,yu的地址传递给被调函数(地址传递)
heAndChaAndJiAndShangAndYu(a, b, &he, &cha, &ji, &shang, &yu);

printf("和: %d + %d = %d\n", a, b, he);
printf("差: %d - %d = %d\n", a, b, cha);
printf("积: %d * %d = %d\n", a, b, ji);
printf("商: %d / %d = %.2f\n", a, b, shang);
//printf函数打印 % 字符要用 %% 才能打印
printf("余: %d %% %d = %.2f\n", a, b, yu);

return 0;
}


输出结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: