c语言程序设计--指针
- 格式:docx
- 大小:12.26 KB
- 文档页数:3
《C语言程序设计》实验报告实验六使用指针的程序设计学号姓名一、实验目的1、掌握指针的概念,会定义和使用指针变量;2、能正确使用数组的指针和指向数组的指针变量;3、熟悉指针作为函数参数的定义和调用方法;4、能正确使用字符串的指针和指向字符串的指针变量。
二、实验内容1.分析下面的程序并上机运行程序,要求写出3组以上程序的运行结果。
#include <stdio.h>void main(){int *p1,*p2,*p;int a,b;printf("Input a b please");scanf("%d%d",&a,&b);p1=&a;p2=&b;if(a>b){ p=p1;p1=p2;p2=p;}printf("*p1=%d, *p2=%d\n",*p1,*p2);printf("a=%d, b=%d\n",a,b);}『运行结果:』输入1,2得:*p1=1,*p2=2a=1,b=2输入2,1得:*p1=1,*p2=2a=2,b=1输入56,123得:*p1=56,*p2=123a=56,b=1232.下列程序的功能是分别求出数组中所有奇数之和以及所有偶数之和。
形参n给了数组中数据的个数,利用指针odd返回奇数之和,利用指针even 返回偶数之和。
请在下面空白处将实现这一功能的函数完善,并且调试运行出结果。
#include <stdio.h>#define N 10void fun(int *a,int n,int *odd,int *even){int m;*odd=0; *even=0;for(m=0;m<n;m++)if(*(a+m)%2==0)*even+=*(a+m);else*odd+=*(a+m);}void main(){int a[N]={1,10,2,3,19,6},i,n=6,odd,even;printf("The original data is:\n");for(i=0;i<n;i++)printf("%5d",*(a+i));printf("\n\n");fun(a,n,&odd,&even);printf("The sum of odd numbers:%d\n",odd);printf("The sum of even number:%d\n",even);}『运行结果:』3.编程实现从键盘输入一个字符ch和一个字符串str,利用字符指针实现删除字符串str中和字符ch相等所有字符,然后输出字符串str。
第9章指针指针是C语言的精华,指针让C语言威力无穷,魅力四射。
为什么scanf函数的实参有时要加一个&操作符,有时却不加?为什么数组作为参数时就可以改变实参的值?这些前面遗留的问题都与指针有关,这些问题的答案均可在本章中找到。
指针是C语言中特殊的数据类型。
整型变量所标识的存储单元中存放整数,浮点型变量中存放浮点数,那么指针变量所标识的存储单元中存放的显然是指针,但是指针是什么呢?9.1 指针类型9.1.1 变量的左值和右值变量用于标识存储单元。
计算机中的内存以字节为单位编号。
编号多为32位的二进制数,从0号开始,即0x0000 0000、0x0000 0001、……、0xffff ffff。
计算机中只用内存编号(又称内存地址)标识内存单元。
如果定义并初始化了一个整型变量如int i = 5;,则计算机中的内存状态可能如图9-1所示。
图9-1 变量i的内存状态图从图9-1可知,整型变量i所标识的存储单元共4个字节,通常以存储单元的首字节地址作为该存储单元的地址,即整型变量i所标识的存储单元的地址为0x0012 ff00,类型为整型。
当取变量i的值时,计算机会把从0x0012 ff00处开始的4个字节作为一个整体,取出其中的内容,然后按整型解码最终得到变量i的值为5。
存储单元如宿舍,其地址像宿舍号(如408),其存储的内容如住宿者(如王五),相关变量名如宿舍的雅称(如liaozhai)。
由以上分析可知,变量既标识存储单元的地址又标识其存储的内容,因此变量比如整型变量i也有两个值。
整型变量i的一个值是地址0x0012 ff00,另一个值是内容5。
变量i在使用时表现为何值呢?例9-1分析语句i = 5; j = i;中整型变量i的值。
分析:语句i = 5;的操作结果是把5放入变量i所标识的存储单元中,也就是把5的补码存入地址为0x0012 ff00的存储单元中,变量i的值此时实为地址0x0012 ff00。
第8章指针【练习8-1】如果有定义”int m, n = 5, *p = &m;”与m = n等价的语句是B 。
A.m = *p; B. *p = *&n; C. m = &n; D. m = **p;解答:A:p是指向m的指针变量,所以*p等价于m。
即m=m。
B:&n是n的地址,*&n是n的值,即把n的值赋给p指向的值m。
即m=n。
C:&n是n的地址。
即把n的地址赋给m。
D:**p是指p指向的指针所指向的值,在此无意义。
故选B。
【练习8-2】调用函数求两个数的和与差:计算输入的两个数的和与差,要求自定义一个函数sum_diff(float op1,float op2, float *psum, float *pdiff),其中op1和op2是输入的两个数,*psum 和*pdiff 是计算得出的和与差。
解答:#include<stdio.h>void sum_diff(float op1,float op2,float *psum,float *pdiff);int main(void){float op1,op2,sum,diff;printf("Input op1 and op2: ");scanf("%f%f",&op1,&op2);sum_diff(op1,op2,&sum,&diff);printf("%f+%f=%f;%f-%f=%f \n",op1,op2,sum,op1,op2,diff);return 0;}void sum_diff(float op1,float op2,float *psum,float *pdiff){*psum=op1+op2;*pdiff=op1-op2;}【练习8-3】两个相同类型的指针变量能不能相加?为什么?解答:不能。
第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。
学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。
(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。
(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。
(4)了解指针与字符串的关系,能熟练使用指针处理字符串。
(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。
(6)指向指针的指针的运用。
【学习导航】本章的在整个课程中的位置如图5-1所示。
图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。
指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。
有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。
8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。
既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。
指针变量和其他类型的变量的区别是:指针变量存储的是地址。
所以要学好指针,就一定要明白数据在内存中是如何存储的。
计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。
地址就是内存区中对每个字节的编号。
下面通过两个整型变量来说明。
整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。
把变量所占用的存储单元首字节的地址作为变量的地址。
C语言中利用取地址运算符“&”获取变量的存储地址。
例如,&c将返回c的首地址;&x将返回x的首地址。
2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。
C语言程序设计字符串-指针-字符串指针一、单项选择题(50题)1、\、/、mod、*等4个算术运算符中,优先级最低的是________。
A、\B、/C、ModD、*2、若有定义: char str1[10] = "aaaaaaa";char str2[10] = "bbbbb";将字符串str2连接到str1,则下列描述中正确的是________。
A、strcat(str1,str2)可以将字符串str2连接到str1中B、strncat(str1,str2,strlen(str2))可以将字符串str2连接到str1中C、strncat(str1,str2,2)可以将字符串str2的前两个字符连接到str1中D、strncat(str1,str2,4)可以将字符串str2的前四个字符连接到str1中3、从键盘上输入某字符串时,不可使用的函数是()。
A、getchar()B、gets()C、scanf()D、fread()4、字符串 "\\\"abc\"\\" 的长度是______。
A、11B、7C、5D、35、设有以下语句, 若 0<k<4,下列选项中对字符串的非法引用是()。
char str[4][2]={"aaa","bbb","ccc","ddd"},*strp[4];int j;for (j=0;j<4;j++)strp[j]=str[j];A、strpB、str[k]C、strp[k]D、*strp6、以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是________。
A、char s[10]=”abcdefg”;B、char t[]=”abcdefg”,*s=t;C、char s[10];s=”abcdefg”;D、char s[10];strcpy(s,”abcdefg”);7、下列能正确进行字符串赋值的是________。
实验6 指针学号:姓名:实验日期:一、实验目的和要求(1)掌握指针的概念、指针变量定义和引用。
(2)掌握指针的运用方法。
(3)掌握数组的指针和指向数组的指针变量。
(4)掌握指针与函数的关系。
(5)能正确使用字符串的指针和指向字符串的指针变量。
(6)了解指向函数的指针。
(7)了解指向指针变量的指针的概念及其使用方法。
二、实验内容(注意:由于本实验报告模板中已经有题目内容,故源代码中无需再附上教材上的题目编号信息,只需有你的学号和姓名信息即可。
以下所有题目都要求代码与运行结果一起截图,只有在代码实在过多无法一起截图情况下,才能分开截图)1、【编写程序】请用指针编程实现:从键盘输入10个数,求出其中的最小值。
提示:定义函数lookup(int *str,int *a,int n)查找数组str中的最小值,将数组中的每一个数跟第一个数进行比较,最后得到最小的数。
2、【编写程序】请用指针编程实现:编写函数change(char *s,int *p),将字符串s 中的数字字符转换成数字存储到整型数组p中,函数返回转换后的数字的个数。
提示:先检测字符是否为数字,数字的ASCII码值为30H~39H,逐个判断s中的字符,如果是数字字符,则将其转换成数字存储到整型数组中。
3、【编写程序】请用指针编程实现:先读入10个整数,然后把它们按从大到小的次序排列起来,最后再读入一个整数k,并将k插入到该整数数列中,插入后的数列仍然按从大到小的顺序排列。
要求:编写一个函数实现排序功能。
4、【编写程序】请用指针编程实现:从键盘输入一个字符串,判断输入的字符串是否为回文。
(回文是指正序和反序字符排例方式相同的字符串,如abcdcba是回文)。
5、【编写程序】请用指针编程实现:写一个函数,实现两个字符串的比较。
即自己写一个strcmpa函数,函数原型为:int strcmpa(char *p1,char *p2),若两个字符串相等则返回0,否则返回这两个字符串第一个不同字符的ASCII码差值。
c语言程序设计--指针
一、地址
1.内存是计算机进行数据运算的物理空间,地址即内存中的指定位置。
2.操作符“&”作用于变量,找到地址。
操作符“*”作用于地址,取得该地址内存中存储的变量。
二、地址应用
1.变量地址做函数参数
void fun1(int *a)
{
函数体;
}
int main()
{
int a=5;
fun1(&a);
return 0;
}
2.数组做函数参数
void fun1(int a[])
{
函数体;
}
int main()
{
int a[5]={5,4,3,21,7};
fun1(a);
return 0;
}
三、指针
1.指针是存放变量地址的变量
2.声明格式:类型说明符*标识符;
3.指针可以指向变量、常量、数组、字符串、结构体、函数。
4.指针需要初始化
例:int *a;
int num=5;
a=#
5.指针指向同一变量时可以进行比较运算,例如当两个指针指向同一数组时,比较运算表示比较两个指针在数组中位置的大小。
两个指针相等表示他们指向数组中的同一个元素。
6.指针和整数进行加减运算,编译器会根据所指对象的数据长度对该整数进行放大,char的放大因子为1,int和short的放大因子为2,long和float的放大因子为4,double的放大因子为8。
7.当两个指针指向同一变量时,他们可以进行减运算。
例如,当两个
指针指向同一个数组时,他们的差是两个指针之间元素的个数。
相减的结果遵守对象类型的字节长度的缩减规则。
8.指向数组的指针
数组在内存空间中的存储是连续的,数组名表示数组的第一个元素的地址。