实验八高级指针一实验目的1)掌握指针操作一维数组的方法,熟悉指针操作二维数组的方法;2)熟悉函数指针的定义与使用方法。二程序示例[源程序2-1]指针与数组。1#include<stdio.h>2int main()314int m[5] = [0,1,2,3,4 ];5int* p= (int*)(&m+1);6printf("%d,%d)n",*(m+1),*(p-1));7return O;8 1[程序输出]m[5]1,4m[0]0[程序分析]m+1本例程序的关键是理解指针操作的“加”m[1]1*(m+1)和“减"。主程序中第4行定义整型数组m,并对数2m[2]组元素进行了初始化,该数组包含5个整型元素,因此m是一个包含5个整型元素的数组。m[3]3程序第5行对m进行取地址操作(&),由于m是一个包含5个整型元素的数组,因p-1此对m取地址后获得的指针应该是一个指向m[4]4*(p-1)包含5个整型元素数组的指针,而再对此指针-&m+1-进行加1操作则是对此类型的地址进行加1,x即上述代码中“&m+1"中“1"的大小实质是
实验八 高级指针 一 实验目的 1) 掌握指针操作一维数组的方法,熟悉指针操作二维数组的方法; 2) 熟悉函数指针的定义与使用方法。 二 程序示例 [源程序 2-1] 指针与数组。 1 #include <stdio.h> 2 int main() 3 { 4 int m[5] = { 0,1,2,3,4 }; 5 int* p = (int*)(&m+1); 6 printf("%d,%d\n", *(m+1), *(p-1)); 7 return 0; 8 } [程序输出] 1,4 [程序分析] 本例程序的关键是理解指针操作的“加” 和“减”。 主程序中第 4 行定义整型数组 m,并对数 组元素进行了初始化,该数组包含 5 个整型元 素,因此 m 是一个包含 5 个整型元素的数组。 程序第 5 行对 m 进行取地址操作(&), 由于 m 是一个包含 5 个整型元素的数组,因 此对 m 取地址后获得的指针应该是一个指向 包含 5 个整型元素数组的指针,而再对此指针 进行加 1 操作则是对此类型的地址进行加 1, 即上述代码中“&m+1”中“1”的大小实质是 m[5] 1 0 2 3 4 X &m+1 m m+1 p-1 *(m+1) *(p-1) m[0] m[1] m[2] m[3] m[4]
"sizeof(m)",而进行强制类型转化(int*)后则变为了指向int类型的指针,因此,p是指向m[4]后一个整型数据(int)首地址的整型指针。程序第6行*(m+1)中的m为数组名称,即指向该数组元素m[0]首地址的指针,是一个整型指针,对其进行加1操作实质是sizeof(m[0]),即则指向了m[1]的首地址。[源程序2-2]通过函数指针调用函数。1#include<stdio.h>2sum(intx,inty);//sum函数声明int3intproduct(intx,inty);//product函数声明4intdifferent(intx,inty);//different函数声明56int main()718int a = 10;9int b = 5;10int result = O;11int(*pfun)(int,int);//定义函数指针1213pfun=sum;//函数指针指向sum函数14result=pfun(a,b);//通过函数指针调用sum函数15printf("pfun = sumresult=%2d)n",result)1617pfun = product;18result = pfun(a,b);19printf("pfun=productresult=%2d\n",result)2021pfun = different;22result = pfun(a,b);23printf("pfun = different result =%2d)n", result);24125//sum函数定义26 int sum(int x, int y)27return x+y;28 1
“sizeof(m)”,而进行强制类型转化(int*)后则变为了指向 int 类型的指针,因此, p 是指向 m[4]后一个整型数据(int)首地址的整型指针。 程序第 6 行*(m+1)中的 m 为数组名称,即指向该数组元素 m[0]首地址的指 针,是一个整型指针,对其进行加 1 操作实质是 sizeof(m[0]),即则指向了 m[1] 的首地址。 [源程序 2-2] 通过函数指针调用函数。 1 #include <stdio.h> 2 int sum(int x, int y);//sum 函数声明 3 int product(int x, int y); //product 函数声明 4 int different(int x, int y); //different 函数声明 5 6 int main() 7 { 8 int a = 10; 9 int b = 5; 10 int result = 0; 11 int (*pfun)(int,int); //定义函数指针 12 13 pfun = sum; //函数指针指向 sum 函数 14 result = pfun(a,b); //通过函数指针调用 sum 函数 15 printf("pfun = sum result = %2d\n", result); 16 17 pfun = product; 18 result = pfun(a,b); 19 printf("pfun = product result = %2d\n", result); 20 21 pfun = different; 22 result = pfun(a,b); 23 printf("pfun = different result = %2d\n", result); 24 } 25 //sum 函数定义 26 int sum(int x, int y){ 27 return x+y; 28 }
29//product函数定义30 int product(int x, int y)31return x*y;32133//different函数定义34 int different(int x, int y)35return x-y;361[程序输出]pfun=sumresult = 15pfun=product result=50pfun=differentresult=5[程序分析]本例声明并定义了3个不同的函数,以返回两个整数参数的和、积和差。在main()函数中,使用下面的语句声明一个函数指针int(*pfun)(int,int);//声明函数指针这个指针可以赋予任何带两个int参数且返回int值得函数。注意给指针赋值的方式:pfun=sum;//指向sum()函数这只是一般的赋值语句,等式右边只有函数名称,不需要添加参数列表或其他数据。如果添加了其他数据,就是错误的,因为这就变成函数调用了,而不是一个地址,此时编译器会报错。在这里,函数的用法非常类似于数组。如果需要的是数组的地址,只要使用数组名即可。同样,如果需要的是函数的地址,也是只使用函数名即可。在main()中,依次将每个函数的地址赋予函数指针pfun,然后使用pfun指针调用每个函数,并显示结果,下面的语句说明了如何使用指针调用函数:result=pfun(a,b)//通过指针调用sum()函数
29 //product 函数定义 30 int product(int x, int y){ 31 return x*y; 32 } 33 //different 函数定义 34 int different(int x, int y){ 35 return x-y; 36 } [程序输出] pfun = sum result = 15 pfun = product result = 50 pfun = different result = 5 [程序分析] 本例声明并定义了 3 个不同的函数,以返回两个整数参数的和、积和差。在 main()函数中,使用下面的语句声明一个函数指针 int (*pfun)(int,int); //声明函数指针 这个指针可以赋予任何带两个 int 参数且返回 int 值得函数。注意给指针赋值的 方式: pfun = sum; //指向 sum()函数 这只是一般的赋值语句,等式右边只有函数名称,不需要添加参数列表或其 他数据。如果添加了其他数据,就是错误的,因为这就变成函数调用了,而不是 一个地址,此时编译器会报错。在这里,函数的用法非常类似于数组。如果需要 的是数组的地址,只要使用数组名即可。同样,如果需要的是函数的地址,也是 只使用函数名即可。 在 main()中,依次将每个函数的地址赋予函数指针 pfun,然后使用 pfun 指 针调用每个函数,并显示结果,下面的语句说明了如何使用指针调用函数: result = pfun(a,b) //通过指针调用 sum()函数
三、程序编写编写一个程序,从键盘上输入一段英文文本,然后计算每个单词出现的次数。要求统计方法使用函数实现
三、程序编写 编写一个程序,从键盘上输入一段英文文本,然后计算每个单词出现的 次数。要求统计方法使用函数实现