第 10 章 指针与函数

合集下载

C语言程序设计_谭浩强_第二版_CH10

C语言程序设计_谭浩强_第二版_CH10

}
第十章 指针 10.3 数组的指针和指向数组的指针变量 10.3.2 通过指针引用数组元素 例10.5输出数组中的全部元素。 ②通过数组名计算数组中元素的地址,找出元素的值。
main() {
int a[10],i; for(i=0;i<10;i++){scanf(“%d”,&a[i]);} print(“\n”); for(i=0;i<10;i++){printf(“%d”,*(a+i));} print(“\n”);
}
运行结果为: 100,10 100,10
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.1 通过指针变量访问整型变量
pointer_1 &a
a 100 *pointer_1
pointer_2 &b
b 10 *pointer_2
第十章 指针 10.2 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
pointer_1 &a
a 5 *pointer_1
pointer_2 &b
b 9 *pointer_2
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
b 5 *pointer_2
&b
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
pointer_1 &a
a 9 *pointer_1

C++基础PPT课件第十章 指针与引用共28页文档

C++基础PPT课件第十章 指针与引用共28页文档
1-7
指向数组的指针
用指针指向数组其实就是让指针指向这段连续内存的 首地址,也就是数组中第一个元素(下标为0)的地址 。定义一个指向数组的指针变量同定义普通指针没有 什么不同,即定义一个跟数组元素类型相同的指针即 可。 由于数组是一段连续的内存,指针可以指向数组,而 且可以通过加减整数来移动指针。所以,可以通过指 针来访问数组,即数组中的元素。指针指向数组的首 地址,进而可以移动指针到指定的元素。也可以一次 只增加1,从而达到遍历整个数组的目的。
C++中指针与引用都是让你间接引用其他对象,但是引用和 指针还是有一些区别,在使用时应当根据实际情况进行 选择。
1-11
动态内存分配
C++的程序中的内存分配分为静态分配和动态分配,其中静 态分配由编译器来在程序运行之前分配,而动态分配是 在程序运行的过程中分配的。
C++中通过关键字new和delete来实现程序的动态内存分配 和回收。其中,关键字new实现内存分配,如果需要对 分配出的内存进行初始化,则在类型后面加上一个括号 ,并带有初始值。因此,C++中动态分配内存的一般形式 如下所示。
1-8
指向字符串的指针
• 事实上,指向字符串的指针就是一个char类型的指针 。与普通指针一样,字符串指针在使用前也必须先定义 。例如,下面语句定义了一个字符串str,并定义了一 个指向该字符串的指针p,并为该指针进行初始化。
• char str[] =”Hello World”; // 定义一个字符串
1-4
指针的访问
• C++中,为了取得一个变量的地址,引入了取地址运算 符&,使用取地址运算符“&”来取得一个变量的地址, 其语法如下所示:

c语言 ●第10章 指针-1

c语言 ●第10章 指针-1
a[1] a[2]

19
2.定义时同时赋值
int a[10];
int *p=a; c规定: /* 相当于int *p=&a[0] */
若有 int a[10];
int *p=a; 则 p+1:指向下一个数组元素。

p+i:其指向下移i个元素。
20
说明:若有 int a[10]; int *p=a; (1) p+i *(p+i) = &a[i] a[i]= a+i *(a+i) (2)数组的指针变量也可带下标 a[i] ,p[i], *(a+i),*(p+i) 是等价的。 (3)a与p的区别:a代表数组a的首地址,是常量。 p=a; p也代表数组a的首地址,是变量。 如:p++; 是正确的,而 a++; 是错误的。 (4)引用数组元素有三种方法: 下标法: a[i]或p[i] 地址法:*(a+i) 效率低 指针法:*(p+i) *p++ 效率高
13
讨论: 若将被调函数swap( )改为: swap(int *p1,int *p2) {int *p; *p=*p1; *p1=*p2; *p2=*p; /*中间变量是指针变量所指的对象*/ } p无确定的地址(地址是随机的),可能指向任何单 元,有可能破坏系统(乱放枪)。加上int c;p=&c;就没 有问题了。
3 6 9 …
i j k
2004
3010
2000
i_pointer
3
二.对内存单位的访问 存数—写 取数—读 对内存单位的访问,是通过地址进行的。 如: printf(“%d”,i); 读 再如:scanf(“%d”,&i); 写 直接访问:按变量的地址直接读写变量的值。 如:k=i+j; (1)从2000开始的内存单元中取出i的值3. (2)从2002开始的内存单元中取出j的值6. (3)相加后,送入2004开始的内存单元。 间接访问:将变量a的地址存入另一变量b中,访问a时,先 找b,取出a的地址,再按此地址访问a。

《C语言程序设计》第8章指针

《C语言程序设计》第8章指针
}
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)

C语言中的函数与指针

C语言中的函数与指针

配存储空间 ,而s p wa 函数 中的a 由s p , wa 函数分 配存储 b
空间 。man i函数执行  ̄s a 函数时 ,调用s a 函数 , Uw p wp
s a/ wp  ̄数为其变量分配存储空间 ,然后实现 了s a 函数 wp
模块用来完成一个特定 的程序功能 。引用一个函数 时, 需要包括对函数 的定义 、声明 ,继而调用 。在掌握 函数 相关概念的同时 ,有以下几点需要注意:

ma ( i ) n

建 匙 b;
vi w pi ait ) o s a( t , d n nb

i£ ; & £
s a ( b; w pa ) ,
pit %d%d ,b ; r f n (“ , ” a ) , ) )

§ 致

P r in tf( “ % d ,% d ” ,a,b );
显然 ,函数m i a 是调用函数 ( n 调用函数s a w p),函

函数 的有 关概 念
数 s a 是被调用函数。man wp i函数 中的a 由ma 函数分 , b i n
为 了使程序 的编写更加清晰 、直观且易于修改 ,C
语 言中 引用 了函数 。所 谓 函数 ,就 是 一 个程 序模 块 ,该
() 用 函 数 和 被 调 用 函 数 1调
中变量a 的值交换 ,执行完毕后 即释放其 分配变量的 , b
存储 空间。继而 ,ma 函数继续 执行 ,但其变量a 没 i n , b
有 做 任 何 改 变 ,i ma 函数 不 能 实 现 a 的交 换 。 由上 l 1 i ] n , b
电 出版社 , 0 2 2 0

《指针和函数》课件

《指针和函数》课件

指针的优缺点
1 优点
详细讨论指针的优势,包括灵活性、效率和动态内存管理。
2 缺点
探索指针的局限性,包括内存泄漏和悬空指针等常见问题。
函数的定义和调用
讨论函数的定义和调用方式,以及函数在编程中的重要性和作用。
函数的参数和返回值
函数参数
详细解释函数参数的传递方式,包括按值传递、按引用传递和按指针传递。
动态内存分配
2
动态内存管理中的应用。
探讨动态内存分配的概念和用法,以及
通过malloc()和free()来管理动态内存。
3
内存泄露
讨论内存泄露的原因和后果,以及如何 避免和解决内存泄露问题。
回调函数
详细解释回调函数的概念和用法,以及如何通过回调函数实现程序的灵活性和扩展性。
指针的应用举例
链表
深入讲解链表的概念和实现, 以及指针在链表中的重要作 用。
指针类型
讨论各种指针类型,包括整 型指针、字符型指针、浮点 型指针等。
空指针
介绍空指针的概念和用途, 以及如何正确使用和判断空 指针。
指针的运算
指针算术运算
详细解释指针进行算术运算的规 则和应用场景。
指针比较
讨论指针之间的比较,包括相等 性比较和大小关系比较。
指针的自增和自减
介绍指针的自增和自减操作,以 及它们的实际应用。
讨论指向常量的指针的定义和应 用场景,以及如何通过指针修改 指向的常量。
常量指针和指向常量的指 针组合
介绍常量指针和指向常量的指针 在一起使用的情况和注意事项。
指向指针的指针
详细讲解指向指针的指针的概念和用法,以及通过指向指针的指针实现多级 间接访问。
内存管理和动态内存分配

c语言第10章指针


3.间接引用指针
间接引用指针时,可获得由该指针变量所指向的变量内容。
例如,int i=10,*ip=&i;
ip
i
cout<<*ip<<endl;
0000:F384 0000:F384 210
运行结果为:10 即指针ip所指向的变量i的内容。
*放在定义过的指针变量之前,称为间接引用操作符; *放在指针变量定义中时,称为指针定义符。 非指针变量不能用间接引用操作符,*只能作用于地址。
例如, double d=1.23,*dp; char c,*cp;
在&和cp*=作&d用; 下,对变量d和dp有如下6种操作: 其d,中d,dpp,=*&d*是cd; ,非*法dp的,;&&d指,dp针&是只d指p能。针指的向地与址其即同二类级型指的针量。 另外,指针除了可指向所有基本类型的变量外,指针也可 指向常量、数组、数组元素、函数、指针以及文件等。
int ii=n1t0;b, a[10]; int *inpt=&*pi;1,//*初p2始; 化为整型变量的地址,但 *ip=p&1=i;&//是b;错误的
注意:p2不=p要1将; “//可in以t *将ip=一&个i;”已与赋“值*i的p=指&i针;”混赋淆给。另一个相同类型的指针 前者是p2定=&义a语[5句];,*是指针定义符,系统为指针变量ip分配一个空间, 并2、用i数的地组址的值地初址始值化;可后用者该是数执组行语的句数,组左名右表两边示类。型例不如匹:配。 指 例3、针如变,ip函n=d*d量t数bodob;up在u的b=b[3使ll6ee].地8[用*d;4d=址]前/p2,/!(;.,*5值;p一)由[定4该]要; 函被数$赋$$以的d$:p一$名$个$字$地来址表值$$$,示$:否$。$$则$例是如很#6某#:危.#8变险量的。 没有被do赋ub值le的s指in针(d变ou量bdlep的x值);是一个随机地址,把6.8赋给内存中的 随机位do置ub,le很(可*p能f)破( 坏); 了另一个变量,甚至修改了栈中的函数返回 地址,pf造=s成in计; 算机死机或进入死循环。

第十章 指针(含答案)

第十章指针一、选择题1.以下程序的运行结果是【C】。

sub(int x,int y,int *z){*z=y-x ;}main(){ int a, b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);printf(”%4d,%4d,%4d\n”,a,b,c);}A. 5,2,3 B. -5,-12,-7 C.-5,-12,-17 D. 5,-2,-72.若已定义 char s[10]; 则在下面表达式中不表示s[1]的地址的是【 B 】A)s+1 B)s++ C)&s[0]+1 D)&s[1]3.下列程序能对两个整型变量的值进行交换。

以下正确的说法是【 D】。

main(){ int a=10,b=20;printf("(1)a=%d,b=%d\n",a,b);swap(&a,&b);printf(“(2)a=%d,b=%d\n”a,b);}swap(int p, int q){ int t; t=p;p=q;q=t;}A. 该程序完全正确B. 该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可C. 该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可D. 以上说法都不正确4.有四组对指针变量进行操作的语句,以下判断正确的选项是【】。

(1)int *p,*q; q=p;int a,*p,*q;p=q=&a;(2)int a,*p,*q; q=&a; p=*q;int a=20, *p; *p=a;(3)int a=b=0,* p; p=&a; b=* p;int a=20,*p,*q=&a; *p=*q;(4)int a=20,*p,*q=&a; p=q;int p, *q; q=&p;A.正确:(1);不正确:(2),(3),(4)B.正确:(l),(4);不正确:(2),(3)C.正确:(3);不正确:(1),(2),(4)D.以上结论都不正确5.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是【】。

C语言学习之指针函数与函数指针

函数、指针这两个词结合的顺序不同其意义也不同,即指针函数与函数指针的意义不同。

指针函数指针函数的本质是一个函数,其返回值是一个指针。

示例如下:int *pfun(int, int);由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。

即:int *(pfun(int, int));接着再和前面的“*”结合,说明这个函数的返回值是一个指针。

由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。

指针函数示例程序如下:#include <stdio.h>//这是一个指针函数的声明int *pfun(int *arr, int n);int main(void){int array[] = {0, 1, 2, 3, 4};int len = sizeof(array)/sizeof(array[0]);int *p;int i;//指针函数的调用p = pfun(array, len);for (i = 0; i < len; i++){printf("array[%d] = %d\n", i, *(p+i));}return 0;}//这是一个指针函数,其返回值为指向整形的指针int *pfun(int *arr, int n){int *p = arr;return p;}程序运行结果如下:主函数中,把一个数组的首地址与数组长度作为实参传入指针函数pfun里,把指针函数的返回值(即指向数组的指针)赋给整形指针p。

最后使用指针p来遍历数组元素并打印输出。

函数指针函数指针其本质是一个指针变量,该指针变量指向一个函数。

C程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。

函数指针示例:/*声明一个函数指针 */int (*fptr) (int, int);/* 函数指针指向函数func */fptr = func; // 或者fptr = &func;func是一个函数名,那么func与&func都表示的是函数的入口地址。

函数指针与指针函数

7.3 函数指针与指针函数
指针变量可以指向变量地址、数组、字符串、 指针变量可以指向变量地址、数组、字符串、动 态分配地址,同时也可指向函数, 态分配地址,同时也可指向函数,每一个函数在编译 系统会分配给该函数一个人口地址, 时,系统会分配给该函数一个人口地址,函数名表示 这个人口地址,那么, 这个人口地址,那么,指向函数的指针变量称之函数 指针变量. 指针变量
[例7.23]下列程序的可执行文件名为test.exe。 23]下列程序的可执行文件名为test exe。 test. argc, main(int argc,char *argv[]) { int i; printf(“argc= argc); printf(“argc=%d\n”,argc); for(i= i<argc; for(i=1;i<argc;i++) printf(” argv[i]); printf(”%s\n”,argv[i]); } 在操作系统提示符下,输入如下命令行: 在操作系统提示符下,输入如下命令行:
│2x - 1.76 │ fun1(x)=───────── (x-0.3)(10.5 -x) (x-
Cos(x-1.3) Cos(x-
例如:fun1( 例如:fun1( 1.66 ) = -0.806 ****************************************************** *******************/
*********************************************************/
fun( char str1[], char str2[]) { /*================================================*/ int i,j,k,len,len1; char ch; i<len len=strlen(str1); strcpy(str2,""); k=0; for (i=0;i<len-1;i++) { ch=str1[i]; ; if (ch>='A' && ch<='Z') ch=ch+32 else if ( ch>='a' && ch<='z' ) ch=ch-32; str2[k]=ch; k++; } str2[k]='\0'; /*-------------------------------------------------------*/ }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第10章指针与函数10.1 函数的参数为指针
概念:一般调用函数通过函数名返回一个具体的数,而此处是返回一个地址
定义函数格式:
类型名*函数名(形参表)
{
函数体
return(e);
}
此处的e是一个指针变量或一个对象的地址
例:
int *max(x,y)
在函数名前加一个*
注意:
此函数是返回地址,那么于return之后的e的值要对应
10.3 函数的指针
因为函数也要占内存,所以也存在地址,用函数地址的目的是通过函数指针调用函数
定义格式:
设有一个函数,max(x,y)
int (*p)(类型表);
p=max;将函数nax的地址赋给p
10.4 指针数组和指针的指针
1、指针数组
定义一串存放地址的元素。

int *p[5]; (*p)[5]
其中每个元素均存放地址
例:10.16
2、指针的指针
专门存放指针变量地址的变量
格式:
int x,*p,**pp;
x=90;
p=&x;
pp=&p;
*p的值是90
**pp的值也是90
而p的值是x的地址
*pp的值是p的内容及x的地址
10.5主函数带参数
因为其它函数不能调用主函数,所以主函数代参数必须通过dos调用赋实参(1)、定义主函数代参数:
main(int n,char *c[])
其中:只能是2个形参
第一个是一个整型变量
第二个是一个无大小的字符指针数组
他们的值是通过dos调用得到
(2)、调用的格式
程序名,实参表
实参之间用空格分开。

当调用完后,n的值是实参个数加1
c的值是程序名及个实参名(均当字符处理)
main(int n,char *c[])
{
int a;
for(a=0;a<n;a++)
printf(“a=%d %s\n”,a,c[a]);
}。

相关文档
最新文档