实验报告_实验2 指针(2)(1540707103_周家尧)
一、实验目的:
1、掌握指针变量p的算术运算:p±n(n为整数)、p++(p--)、++p(--p),理解移动一个数据单位的真实含义;
2、能够用数组名或指针变量作函数形参,在函数中实现对数据的批量处理。 3、熟悉二维数组“行指针”、“列指针”的类型,加减1所移动的字节数,以及如何利用它们来存取数组元素。
二、实验内容
2、(基础题)使用指针编程实现:输入3个正整数,按由小到大顺序输出。程序运行结果如下所示:
(提示:可以调用swap(int * x, int * y)来实现)
程序代码:
# include
int a,b,c;
printf(\请输入三个整数\\n\ scanf(\ swap(&a, &b); swap(&a, &c); swap(&b, &c);
printf(\由小到大的顺序输出为:\\n\ printf(\ return 0; }
swap(int * x, int * y) {
int t;
if(*x > *y) {
}
t = *x; *x = *y; *y = t; }
3、(基础题)分析、运行下列程序,理解二维数组“行指针”、“列指针”的类型,
加减1所移动的字节数,熟悉二维数组元素的间接访问方法,并回答相关问题: 问题:
(1)二维数组a的“行指针”的类型是什么?加减1所移动的字节数是多少?列举2个该类型指针的例子;
1、int(*)[5]; 2、20;
3、int a[4][5],int b[3][4][5];此时,a、b[0]为该类型指针;
(2)二维数组a的“列指针”的类型是什么?加减1所移动的字节数是多少?列举2个该类型指针的例子;
1、int *; 2、4;
3、int a[4][5];此时,a[0]、a[1]为该类型指针
(3)二维数组a的“列指针”与“行指针”有什么联系?a+i与a[i]、*(a+i)、&a[i]有什么关系?
1、二维数组a的“列指针”在数值上与“行指针”的首地址相同,但代表的意义不同, “行指针”在进行加减运算时,每加一跳到下一行,而“列指针”在进行加减运算时,每加一跳到下一列。
2、a + i 代表二维数组a的i行的首地址,与&a[i]相同;a[i]代表代表二维数组 a i行0列的元素地址,就是*(a+i);
(4)列出a[i][j]地址的4种写法。
&a[i][j] a[i]+j
*(a+i)+j
4、&(*(a+i))[j]
4、(提高题)编程实现:在主函数中定义一个有10个元素的float数组,并赋值。该程序还包含两个函数:
(1)void change(float *x,int k)的功能是让该数组中的前k个元素值为0; (2)void print(float *x,int n)的功能是输出该数组中的所有元素;
请在主函数中分别调用这两个函数,验证是否实现所要求功能。
程序代码:
#include
void change(float *x,int k) {
int i;
for(i=0;i void print(float *x,int n) { int i; for(i=0;i printf(\ } int main() { float f[10]= {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9. 10.0}; int k, n; printf(\ scanf(\