第七章 指针

合集下载

C语言实验-第七章-第九章2

C语言实验-第七章-第九章2

实验七:指针的应用【实验目的】1.掌握指针和指针变量,内存单元和地址、变量与地址、数组与地址的关系;2.掌握指针变量的定义和初始化,指针变量的引用方式;3.能正确使用数组的指针和指向数组的指针变量;【实验内容】1.填空题输入一个字符串,将其中的大写字母转换成小写字母,然后输出本程序主要是比较scanf()输入和gets()输入的区别#include <stdio.h>void main(){ char s[20];char *p=s;scanf(“%s”,p); /*注意用scanf()输入和gets()输入的区别*/while( 1 ){if( 2 ) *p=*p+ (‘a’-‘A’);p++ ;}puts ( 3 );}答案:1、*p!=’\0’2、(*p>='A')&&(*p<='Z')3、s运行结果:输入:Program输出:program输入:This is Program输出:this提示:scanf ()输入时遇到空格认为字符串结束,用gets()输入时只有遇到回车才认为字符串结束。

如键入any boy并回车,则2。

补充程序题输入15个整数存入一维数组,再按逆序重新调整该数组中元素的顺序然后再输出。

下面给出部分程序的内容,请将程序补充完整,然后上机调试。

部分程序清单如下:#include <stdio.h>void main(){ int a[15],*p1,*p2,x;for(p1=a;p1<a+15;p1++)scanf("%d",p1);for(p1=a,p2=a+14;p1<a+7;p1++,p2--){ x=*p1;*p1=*p2;*p2=x;}……}答案:for(p1=a;p1!=a+15;p1++)printf("%d ",*p1); // %d后面有一个空格运行结果:输入:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15输出:15 14 13 12 11 10 9 8 7 6 5 4 3 2 1提示:(1)在整型数组中,没有结束标志,必须依靠数组中数据元素的个数控制循环次数。

C语言程序设计实训教程第7章 指 针

C语言程序设计实训教程第7章 指 针

12
2)指针与一维数组 【例 7.6】 下列程序的运行结果是( )。[读 程序写结果,重庆市 2001年第 2次等级考试]
13
14
3)指向字符的指针
15
16
17
18
4)指针与二维数组
19
5)指向一维数组的指针(行指针) 【例 7.18】 对 int(﹡p)[5];的正确描述 是( )。[多选题,重庆市 2003年第 1次等级考 试] A. p是数组名 B. p是指针变量名 C. p数组中有 5个元素 D .p指向一个包含 5个元素的整型数组 E. p是一个整型数组 答案:B D
22
7)指针数组 当数组的元素类型为指针时,叫做指针数组。 【例 7.21】 下列程序的运行结果是( )。 [读程序写结果,重庆市 2004年第 2 次等级考试]
23
8)指针做函数参数 指针做函数参数的主要目的是利用在函数中, 利用指针去操作主调函数中的变量。 【例 7.22】 下列程序在数组中同时查找最大 值下标和最小值下标,并分别存放在 main函数的 变量 max和 min中,请填空。[读程序写结果,重 庆市 2003年第 2次等级考试]
10
【例 7.3】 由于指针的数据类型实际上是指定 指针所能指向对象的数据类型,所以不同数据类型 的指针变量不能相互赋值。( )[判断题,重庆市 2005年第 2次等级考试] 答案:对 分析:在某些特定情况下,可以在不同数据类 型指针之间通过强制类型转换赋值。
11
【例 7.4】 若有定义:long intj,﹡p;,则操 作 j=(long int)p;是合法操作。( )[判断题, 重庆市 2004年第 1次等级考试] 答案:对 【例 7.5】 在 C 语言中,程序

C语言教材第七章指针实验

C语言教材第七章指针实验

C语⾔教材第七章指针实验第七章指针第⼀部分知识训练【知识要点】1. 地址与指针指针变量的概念:⽤⼀个变量专门来存放另⼀个变量的地址。

2. 指向变量的指针变量指针变量的形式:基类型 *指针变量名;&: 取地址运算符;*:指针运算符。

3. 指针与数组引⽤⼀个数组元素可以⽤下标法和指针法;可以⽤数组名作函数的参数。

4.指针与函数函数指针变量定义的⼀般形式为:类型说明符 (*指针变量名)();⼀个函数的返回值可以是⼀个函数。

【典型习题与解析】5. char * const p;char const * pconst char *p上述三个有什么区别?【解析】char * const p; //常量指针,p的值不可以修改;char const * p;//指向常量的指针,指向的常量值不可以改;const char *p; //和char const *p。

6. main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}输出结果是什么?【解析】答案:输出:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执⾏结果是2,5。

&a+1不是⾸地址+1,系统会认为加⼀个a数组的偏移,是偏移了⼀个数组的⼤⼩(本例是5个int)。

1)&a是数组指针,其类型为 int (*)[5];⽽指针加1要根据指针类型加上⼀定的值,不同类型的指针+1之后增加的⼤⼩不同。

2)a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a[5],但是prt与(&a+1)类型是不⼀样的(这点很重要),所以prt-1只会减去sizeof(int*) a,&a的地址是⼀样的,但意思不⼀样。

3)a是数组⾸地址,也就是a[0]的地址,&a是对象(数组)⾸地址,a+1是数组下⼀元素的地址,即a[1],&a+1是下⼀个对象的地址,即a[5]。

《c++程序设计》第7章 指针

《c++程序设计》第7章 指针
2.指针变量的赋值
(1)取地址运算符&: 取出变量的内存首地址
(2)指针变量的赋值: 指针变量=&变量;或指针变量=指针变量;
3.指针变量的引用
指针运算符* :通过指针变量间接访问变量对应存储单元内容。
【例7.1】定义指针变量
p、p1、q,并将变量a的 地址赋给p、p1,输出a、 p、p1、*p、*p1的值。
【例7.3】指针变量的自加、自减、加n和减n运算。例程
3.指针变量的关系运算
指针变量的关系运算是指针变量值的大小比较,即 对两个指针变量内的地址进行比较,主要用于对数组元 素的判断。
【例7.4】用指针变量求一维实型数组元素和,并输出数组每个元 素的值及数组和。 例程
4.指针运算符的混合运算与优先级
指针数组
例如,指针数组的定义: int *pi[4];
表示定义了由4个整型指针元素pi[0]、pi[1]、pi[2]、pi[3]组成的整型指针数组。 char *pc[4];
表示定义了由4个字符型指针元素pc[0]、pc[1]、pc[2]、pc[3]组成的字符型指针数组。 (3)指针数组元素的引用 【例7.15】用指针数组输出字符串
3.数组元素的引用
对一维数组a[ ]而言,当p=a时: ①第i个元素地址:&a[i]= p+i=a+i。 ②第i个元素值:a[i]= *(p+i) =*(a+i)=p[i]。
一维数组的第i个元素有四种方式引用: a[i]、*(p+i) 、*(a+i)、p[i]。
用数组指针的四种方法求一维数组中的最大值的方法为: 方法一:使用*(a+i)访问a[i] 方法一:用指针变量名p代替数组名a,即用 p[i]代替a[i] 方法二:移动指针变量p++,用*p访问a[i] 方法三:使用*(p+i)访问第 i个元素a[i]

第7章 指针(答案)

第7章 指针(答案)

p=&a; printf("%d\n",++*p); } A)23 B)24 C)25 D)26 9、下列函数的功能是(A) int fun (char *x){ char *y=x; while(*y++); return(y-x-1); } A)求字符串的长度 B)比较两个字符串的大小 C)将字符串x复制到字符串y C)将字符串x连接到字符串中y后面 10、设有如下定义 char *aa[2]={"abcd","ABCD"}; 则以下说法正确的是(C) A)aa数组的元素的值分别是“abcd”和“ABCD”。 B)aa是指针变量,它指向含有两个数组元素的字符型一维数组。 C)aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地 址。 D)aa数组的两个元素中各自存放了字符'a'和'A'的地址。 11、若有以下定义和语句 int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a; 则不能表示a数组元素的表达式是(B) A)*p B)a[10] C)*a D)a[p-a] 12、下面定义不正确的是(B) A)int *p; B)int p[n]; C)int *p(); D)int (*p)(); 13、有下面程序(假设int 类型为2个字节) main() { int a[10]={1,2,3,4,5,6,7,8,9,0},*p; p=a; printf("%x\n",p); printf("%x\n",p+9); } 该程序有两个printf函数,如果第一个printf输出的是194,则第二个 printf输出的结果是(D) A)203 B)204 C)1a4 D)1a6 14、下面程序的输出结果是(D)

全国计算机二级考试C语言(最全复习资料)

全国计算机二级考试C语言(最全复习资料)

第一部分 C语言知识复习资料第一章C语言基本知识【考点1】C程序用C语言编写的程序称为C语言源程序,源程序文件的后缀名为“.c”。

源程序经编译后生成后缀名为“.obj”的目标文件,再把目标文件与各种库函数连接起来,生成“.exe”可执行文件。

C语言有三种基本结构:顺序结构、选择结构、循环结构。

【考点2】main函数又称主函数,是C程序的入口。

main后面跟一对小括号和一对花括号,花括号括起来的部分称为main 函数的函数体。

一个C程序从main函数开始执行,到main函数体执行完结束,而不论main函数在整个程序中的位置如何。

每一个程序有且仅有一个main函数,其他函数都是为main函数服务的。

【考点3】存储形式计算机在电脑中保存数据是采用二进制形式,由0或1构成的二进制称为位(bit),八个位构成一个字节(Byte),1个Byte=8个bit。

二进制、八进制、十六进制转化为十进制采用乘法,十进制转化为二进制、八进制、十六进制采用除法。

数据的存放位置就是它的地址。

【考点4】注释是对程序的说明,可出现在程序中任意合适的地方,注释从“/*”开始到最近一个“*/”结束,其间任何内容都不会被计算机执行,注释不可以嵌套。

【考点5】书写格式每条语句的后面必须有一个分号,分号是语句的一部分。

一行内可写多条语句,一个语句可写在多行上。

【考点6】标识符是标识名字的有效字符序列,可以理解为C程序中的单词。

标识符的命名规则是:(1)标识符只能由字母、数字和下划线组成,字母区分大小写。

(2)标识符的第一个字符必须是字母或下划线,不能为数字。

C语言标识符分如下3类(1)关键字。

它们在程序中有固定的含义,不能另作他用。

如int、for、switch等。

(2)预定义标识符。

预先定义并具有特定含义的标识符。

如define、include等。

(3)用户标识符。

用户根据需要定义的标识符,符合命名规则且不与关键字相同。

【考点7】常量与变量常量是指在程序运行过程中,其值不能改变的量。

c语言程序设计基础第五版知识点总结

c语言程序设计基础第五版知识点总结

c语言程序设计基础第五版知识点总结C语言是一门广泛应用于科学计算、操作系统、嵌入式系统等领域的编程语言。

对于初学者来说,进修C语言是打下编程基础的重要一步。

本文将总结《C语言程序设计基础第五版》中的主要知识点,援助读者快速精通C语言的基本观点和编程技巧。

第一章:C程序设计概述本章主要介绍C语言的进步历史、特点以及编程环境的配置。

读者可以了解到C语言的起源以及C语言程序的基本框架。

第二章:C语言基本数据类型(数据类型、变量、常量)C语言中有多种数据类型,包括整型、字符型、实型等。

本章详尽介绍了各种数据类型的定义和使用方法,并提供了一些实例演示。

第三章:C语言运算符和表达式运算符是C语言中常用的操作符号,用于完成各种数学和逻辑运算。

本章详尽介绍了各种运算符的使用方法和优先级规则,并提供了一些例子进行实践。

第四章:C语言控制结构控制结构是编程语言中用于控制程序流程的语句和机制。

本章介绍了C语言中的次序结构、选择结构和循环结构,并提供了一些实例演示,援助读者理解和应用这些结构。

第五章:C语言数组与字符串数组是C语言中常用的一种数据结构,可以存储多个相同类型的数据。

本章详尽介绍了数组的定义和使用方法,并提供了一些例子援助读者熟识数组的操作。

字符串是由字符组成的一种特殊的数组,本章也介绍了字符串的相关观点和操作方法。

第六章:C语言函数与参数传递函数是C语言中模块化编程的重要组成部分,函数可以将一些操作封装起来,提高代码的可读性和重用性。

本章详尽介绍了函数的定义、调用和传递参数的方法,并提供了一些实例援助读者精通函数的使用技巧。

第七章:C语言指针指针是C语言中分外重要的观点,通过指针可以实现对内存的直接操作。

本章介绍了指针的定义和使用方法,包括指针的基本操作、指针与数组和函数的干系等。

第八章:C语言结构体、联合与列举结构体、联合和列举是C语言中用于组织和管理复杂数据的机制。

本章详尽介绍了结构体、联合和列举的定义和使用方法,并提供了一些实例援助读者理解和应用这些机制。

c语言程序设计课本

c语言程序设计课本

c语言程序设计课本C语言程序设计是一门基础而重要的计算机编程语言课程,它以其高效、灵活和广泛适用性而闻名。

C语言由丹尼斯·里奇在20世纪70年代初开发,至今仍然是许多操作系统和嵌入式系统的开发语言。

本课本将引导学生从基础概念开始,逐步深入到C语言的高级特性,帮助学生掌握C语言程序设计的基本技能。

第一章:C语言概述- C语言的历史和发展- C语言的特点- 简洁性- 灵活性- 可移植性- C语言的应用领域- 操作系统- 嵌入式系统- 硬件驱动程序第二章:C语言环境搭建- 编译器和开发环境介绍- GCC- Clang- Visual Studio- 编译和链接过程- 编写第一个C程序- `Hello, World!` 示例第三章:基本数据类型和运算符- 数据类型- 整数类型- 浮点类型- 字符类型- 变量声明和初始化- 运算符- 算术运算符- 赋值运算符- 逻辑运算符- 位运算符第四章:控制结构- 条件语句- `if` 语句- `switch` 语句- 循环语句- `for` 循环- `while` 循环- `do-while` 循环- 跳转语句- `break`- `continue`- `goto`第五章:数组和字符串- 一维数组- 多维数组- 字符串处理- 字符串定义和初始化 - 字符串操作函数- `strcpy`- `strcat`- `strlen`- `strcmp`第六章:函数- 函数的定义和声明- 函数的参数传递- 值传递- 引用传递- 递归函数- 作用域和生命周期第七章:指针- 指针的基本概念- 指针和数组- 指针的运算- 指针与函数- 动态内存分配- `malloc`- `calloc`- `realloc`- `free`第八章:结构体和联合体- 结构体的定义和使用- 联合体- 枚举类型- 结构体和指针第九章:预处理器- 宏定义- `#define`- 文件包含- `#include`- 条件编译第十章:文件操作- 文件的打开和关闭- `fopen`- `fclose`- 文件读写- `fread`- `fwrite`- 文件定位- `fseek`- `ftell`- 错误处理第十一章:高级特性- 位域- 内联函数- 静态库和动态库的使用第十二章:C语言编程实践- 代码风格和规范- 调试技巧- 性能优化结语- C语言的重要性- 未来学习方向- 推荐阅读和资源附录:- A. C语言关键字列表- B. 常用库函数速查表- C. 常见错误和解决方案参考文献:- Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language (2nd ed.). Prentice Hall.- Deitel, H. M., & Deitel, P. J. (2001). C: How to Program (3rd ed.). Prentice Hall.通过本课本的学习,学生将能够理解C语言的基本概念,掌握其语法规则,学会使用C语言进行程序设计,并能够解决实际问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第8 章
指针
华厦职业学院
C语言程序设计
在这一章中将介绍C语言程序的指针,指针是 一内存中的地址,任何一个变量在内存中都有一个 空间,这个空间有一个地址,这个地址就是变量的 指针,通过指针可以实现对内存的直接访问。
华厦职业学院
C语言程序设计
8.1 8.2 8.3 8.4 8.5 8.6 8.7
指针概述 指针与函数参数 指针与数组 数组与函数参数 字符串与指针 指针与二维数组 动态数组
华厦职业学院
C语言程序设计
指针变量的赋值
指针变量是一个可以存储指针值的变量,在32位系 统中它占4个字节,可以把一个变量用&取地址后赋 值给这个指针变量,例如:
int a=1,*p; p=&a; 此时p存储了变量a的地址。注意变量p本身也是一个变量, 它自己也有一个存储单元,这个存储单元显然与变量a的 存储单元是不同的,变量a的存储单元存储的是变量a的值, 而变量p存储单元存储的是变量a单元的地址,如图7-3所 示。
华厦职业学院
C语言程序设计
通过指针访问变量
既然指针变量指向一个变量,因此通过指针变 量也就知道变量的位置,知道位置也就能访问到变 量,可以通过指针变量存取变量的值。
华厦职业学院
C语言程序设计
C中规定通过:
*指针变量 来访问对应变量的值,例如: • int a=1,b,*p; • p=&a; • *p=2; // 设置p指向的变量的值为2,既a=2 • b=*p; // 把p指向的变量的值赋予b,既b=2 在C语言中,系统对“*指针变量”的解释是根据指 针变量的类型计算出对应变量所占字节数,之后把指针变 量所指的连续的几个字节的二进制数据看成是与指针变量 同类型的数据并存取这一include <stdio.h> void fun(int *p,int b) { printf("fun中: p=%p *p=%d &b=%p b=%d\n",p,*p,&b,b); *p=100; b=100; } void main() { int a=1,b=2,*p; p=&a; printf("调用前: p=%p a=%d &b=%p b=%d\n",p,a,&b,b); fun(p,b); printf("调用前: p=%p a=%d &b=%p b=%d\n",p,a,&b,b); }
华厦职业学院
C语言程序设计
8.2.2 值传递与地址传递
在前面章节中曾经介绍过当变量作为函数参数时, 它是函数的一个局部变量,它在函数内的改变不会 影响到主函数的对应实参数变量。但如把指针变量 作为函数参数来传递情况有不同,通过该指针变量 去改变对应变量的值会影响到主函数对应的变量。
华厦职业学院
C语言程序设计
华厦职业学院
C语言程序设计
8.1
指针概述
在计算机中,所有的数据都是存放在存储器中的,不同的 数据类型所占用的内存单元数不等,如int整型量占4个字 节,字符量占1个字节。 为了正确地访问这些内存单元, 必须为每个内存单元编 上号,根据一个内存单元的编号即可准确地找到该内存单 元。 内存单元的编号也叫做地址。 既然根据内存单元的编号 或地址就可以找到所需的内存单元,所以通常也把这个地 址称为指针。
华厦职业学院
C语言程序设计
一般要保证变量类型与指针类型一致,不能把 一种类型的变量的指针赋值给另外一种不同类型的 指针变量。但是由于指针毕竟是一个内存地址,从 物理上来说,p与q都是内存地址,在32位系统中都 是32位二进制地址值,没有什么本质区别,因此经 过转化后还是可以交叉赋值的,通过指针的类型转 换可以实现下列赋值:
华厦职业学院
C语言程序设计
C语言中把函数参数是指针变量的传递方法称 为地址传递,它传递的是变量的地址,因此在函数 中用此地址改变对应变量的值时,实际上改变的是 主函数中的变量的值。而把函数参数是普通变量的 传递称为值传递,它传递的是实际参数的值,而且 它是函数的局部变量,因此它的值在函数中改变时 不会影响到主函数中实际参数的值。
华厦职业学院
C语言程序设计
p=(int*)&c; // &c是char *指针,(int*)转化后成为int *类型 指针 q=(char*)&a; // &a是int *指针,(char*)转化后成为char *类 型指针 一般指针变量类型的转换可以通过下面方式完成: (数据类型 *)指针 另外数组变量也可以取指针,例如: int a[5],*p; p=&a[0]; // p指向a[0]变量 p=&a[4]; // p指向a[4]变量 关于数组与指针的关系在后面章节中再进一步讲解。
华厦职业学院
C语言程序设计
图7-3 变量指针与指针变量
华厦职业学院
C语言程序设计
指针变量是有类型的,例如:
• int *p; • char *q; • 则p是一个指向整数变量的指针变量,q是一个指向字 符变量的指针变量,在对它们赋值时要注意类型匹配, 例如: • int *p,a; • char *q,c; • p=&a; // 正确 • q=&c; // 正确 • p=&c; // 错误 • q=&a; // 错误
华厦职业学院
C语言程序设计
8.1.2 变量的指针与指针变量
1. 指针变量
系统的指针地址可以用一个变量来存储,这个变量就是指 针变量。指针变量的定义规则是: 数据类型 * 变量名称; 指针变量的定义与普通变量十分相似,只是在其中插入了 一个“*”号,例如: int *p; p是指针变量,可以用来存储一个整数变量的地址,或称 它指向一个整数变量。严格地说,一个指针是一个地址, 是一个常量。而一个指针变量却可以被赋予不同的指针值, 是变量,但通常把指针变量简称为指针。
华厦职业学院
C语言程序设计
8.2
指针与函数参数
指针作为函数参数
指针变量与普通变量一样也可以作为函数参数来传递, 实际参数是一个变量的指针,该变量的指针传递到函数的 形式参数指针变量,这样形式参数的指针变量仍然指向实 际参数,换句话说就是在函数中可以访问主函数的实际参 数。 但要注意函数如返回一个指针,则这个指针指向的 变量必须有效,不能返回一个函数局部变量的指针,这个 指针是无意义的,因为函数的局部变量在函数退出时已经 销毁了。
相关文档
最新文档