指针函数和函数指针的区别

合集下载

数组和指针的区别

数组和指针的区别

数组和指针的区别数组和指针是C语言中非常重要的两个概念,它们在编写程序时起着极其重要的作用。

虽然它们在某种程度上非常相似,但它们之间也存在着很多的差异,下面我们就来分析一下它们的区别。

1. 定义方式数组是由一组具有相同类型的数据元素所组成的有序集合,每个元素具有相同的数据类型,可以通过下标在数组中访问对应的元素。

在C中,定义一个数组可以使用以下语句:```int arr[10];```这个语句定义了一个名为arr的整型数组,这个数组有10个元素。

而指针是一个变量,它存放了一个内存地址,这个地址与它存储的数据类型有关。

在C中,定义一个指针可以使用以下语句:```int *p;```这个语句定义了一个名为p的指针,这个指针指向一个整型变量。

2. 内存分配数组在定义时要求需要一定的内存空间来存储数组元素,因此在定义时就已经确定了内存空间的大小,且数组的大小不可改变。

例如,如果定义一个大小为10的数组,则它的大小就是10,无论实际使用时需要存储的元素个数是多少,数组的大小都不会改变。

而指针在定义时只需要分配一个指针变量所需的内存空间,该指针可以在程序运行时动态地分配内存,因此指针所指向的内存空间大小不确定,需要在运行时根据需要动态地分配或释放空间。

3. 访问方式在数组中,可以通过数组的下标来访问数组中具体的元素,下标从0开始,最大下标为数组大小减1。

例如,访问arr数组中的第三个元素可以写成:arr[2]。

而对于指针,可以通过指针变量所指向的地址来访问该地址所对应的值。

例如,访问p指针所指向地址上的整型变量可以写成:*p。

4. 传递方式在函数调用时,数组可以通过值传递或指针传递来传递数组的值。

如果数组作为参数传递给函数时,实际上传递的是该数组的地址,即使数组非常大,也不会导致栈溢出。

而对于指针,只能通过指针传递方式来传递指针变量的值,在函数内部可以通过指针来修改该指针所指向的地址所存储的值,因此指针可以用来传递地址或修改变量的值。

函数———大连理工大学软件学院蒋光远

函数———大连理工大学软件学院蒋光远

2012-9-30
14
C程序设计快速进阶大学教程
11.2.2 指针变量的引用 指针变量说明: 7. 同类型指针变量间可以相互赋值
例11.1 交换指针变量 #include <stdio.h> int main() { int i1=3,i2=4; int *pi1,*pi2,*pi3; pi1=&i1; pi2=&i2;pi3=0; /*交换指针变量*/ pi3=pi1; pi1=pi2; pi2=pi3; printf("i1=%d\ni2=%d\n",i1,i2); printf("*pi1=%d\n*pi2=%d\n",*pi1,*pi2); return 0; }
程序运行结果:
i1=3 i2=4 *pi1=4 *pi2=3
2012-9-30
15
C程序设计快速进阶大学教程
11.2.2 指针变量的引用 指针变量说明: 7. 同类型指针变量间可以相互赋值
例11.1 交换指针变量
起始地址为0012FF70 起始地址为0012FF78 起始地址为0012FF70 0012FF78 占用4字节 (指针变量pi1) 起始地址为0012FF68 00000000 占用4字节 (指针变量pi3) 3 占用4字节 (变量i1) 0012FF74 占用4字节 (指针变量pi1) 起始地址为0012FF68 00000000 占用4字节 (指针变量pi3) 起始地址为0012FF74 4 占用4字节 (变量i2) 起始地址为0012FF78 3 占用4字节 (变量i1)
第11章 指针 本章要点
指针概念 指针与数组 指针与函数 字符串
动态空间管理
2012-9-30

C语言程序设计第5章“利用指针参数互换两个变量值”案例

C语言程序设计第5章“利用指针参数互换两个变量值”案例

C主讲教师崔玲玲5.1 “互换两个变量值”案例【案例说明】用函数实现两个变量值的互换使其在主调函数和被调函数中的值一致。

要求用指针变量作为函数参数。

程序运行结果如图5.1所示。

图5.1 互换两个变量值【案例目的】1 熟悉如何概念指针变量把握将指针变量作为函数参数的方式。

2 把握通过指针参数由被调函数向主调函数传递多个值的方式。

【技术要点】由于变量的值始终寄存在内存单元中因此要互换两个变量的值只需互换这两个变量对应的存储单元的值即可这就需要明白两个变量的地址。

也确实是说需要保证主调函数与被调函数中所要互换的两个数的内存单元是同一内存单元即传递的参数是内存单元的地址而不是内存单元中的值。

【相关知识及注意事项】1. 指针和地址2. 指针变量的概念及初始化3. 指针变量的赋值4. 指针变量的引用5. 指针作为函数参数5.2 “有序数列的插入”案例【案例说明】用指针法编程插入一个数到有序数列中。

程序运行结果如图5.7所示。

图5.7 有序数列的插入【案例目的】1 熟悉如何概念指针变量把握将指针变量指向一维数组元素的方式。

2 把握如安在一个有序的数列中查找适合的位置。

3 把握如何将一个数插入到一个有序数列中。

【技术要点】1 有序数组中插入一个数的关键是找到该数据插入的位置然后将插入位置及其后的所有元素均后移一名在空出的位置放入待插入的数据。

例如在13、27、3八、4九、6五、7六、97这列有序数据中插入53那个数成为新的有序数列13、27、3八、4九、53、6五、7六、97。

2 概念数组时必需多开辟一个存储单元用于寄存待插入的数据。

【相关知识及注意事项】1. 指针变量的运算2. 指针与一维数组5.3 “两个字符串首尾连接”案例【案例说明】编写程序将两个字符串首尾连接起来。

要求用字符指针变量处置。

程序运行结果如图5.9所示。

图5.9 两个字符串首尾连接【案例目的】1 学会概念基类型为字符型的指针变量并将指针变量指向串首的操作。

《C语言程序设计》教案

《C语言程序设计》教案
十二、位运算及程序调试
教材、
参考书
教材:《C程序设计》(第三版)谭浩强著清华大学出版社2005
参考书:《C语言程序设计案例教程》张基温等 清华大学出版社
《C语言程序设计》教案
授课内容
第1章C语言概述
教学目的
和要求
了解C历史,名称来源、C特点
掌握C程序基本结构
了解C程序上机步骤
重点
难点
1、法成分(标识符、注释)
二、整型数据(内存中补码存储)
1、整型常数。10,8,16进制表示
2、整型变量分类:基本整型int/长/短;有符号/无符号。观察数据表达范围+字节数
3、整型变量定义、初始化。例2-2。
4、整型数据的溢出。例2-2A。
三、实型数据
1、实型常量表示。小数形式,指数形式e。
2、实型变量分类。重要的两种float、double。观察数据表达范围+字节数+有效数字
例如:n+=1等价于n=n+1;x*=y+1等价于x=x*(y+1)
3、赋值运算符、赋值表达式举例。
(1)a=5(2)a=b=5(3)a=(b=4)+(c=3)(4)假如a=12,分析:a+=a-=a*a(答案:-264)
三、自增、自减运算符
单目运算符,使变量的值增1或减1。如:++i,i++(等价i=i+1)--i,i—(等价<=>i=i-1)
十、结构体与共用体
重点:结构体类型的说明及结构体类型变量的定义;结构体变量的引用;结构体变量的初始化;结构体数组;指针与结构体数组;共用体;枚举类型
难点:结构体的基本概念、结构类型及变量的定义、结构数组;用指针处理链表;共用体及枚举类型的基本概念、typedef的基本概念。

使用指针作为函数参数,写一求数组中最大值和最小值的函数。主函数调用此函数

使用指针作为函数参数,写一求数组中最大值和最小值的函数。主函数调用此函数

使用指针作为函数参数,写一求数组中最大值和最小值的函数。

主函数调用此函数下面是使用指针作为函数参数来实现求取数组中最大值和最小值的函数的示例代码:```c++#include <iostream>void findMinMax(int* arr, int size, int* max, int* min) { if (arr == nullptr || size == 0) {return;}*max = *min = arr[0];for (int i = 1; i < size; ++i) {if (arr[i] > *max) {*max = arr[i];}if (arr[i] < *min) {*min = arr[i];}}}int main() {int arr[] = { 5, 3, 9, 2, 7 };int size = sizeof(arr) / sizeof(arr[0]);int max, min;findMinMax(arr, size, &max, &min);std::cout << "Max: " << max << std::endl;std::cout << "Min: " << min << std::endl;return 0;}```在上述示例代码中,函数`findMinMax`接受一个指向整型数组的指针`arr`、数组大小`size`以及指向整型变量的指针`max`和`min`作为参数。

该函数通过遍历数组来找到最大值和最小值,并将结果保存到`max`和`min`指向的内存中。

主函数调用`findMinMax`函数,并输出最大值和最小值。

指针的详细讲解

指针的详细讲解

指针的详细讲解
指针是C语言中重要的概念,也是很多初学者比较困惑的一部分。

在C语言中,指针是一个特殊的数据类型,它直接或者间接地指向了另一个变量或者数据的地址。

指针的基本定义:指针是一个变量,其值是扮演着另一个变量名也就是地址的变量的地址。

指针与变量之间的区别在于,变量存储的是实际的值,而指针存储的是值的内存地址。

指针的类型:在C语言中,指针有不同的类型,这些类型标识了指针指向的变量的数据类型。

例如,int*是一个整数指针,而char*是一个字符指针。

指针的运算:指针可以进行加、减、前后移动等操作。

例如,指针加上一个整数就会指向另一个地址,指针减去一个整数就会回到前一个地址。

指针的使用:指针的主要作用是通过引用来访问变量或者数据。

通过指针,我们可以传递变量的地址而不是变量本身,这样可以减少内存的使用量并提高程序的效率。

指针的注意事项:在使用指针时,需要特别注意指针的安全性。

不正确的使用指针可能会导致内存泄漏、程序崩溃、数据丢失等问题。

总的来说,指针是C语言中一个非常重要的概念,理解它的基本概念和使用方法,对于C语言的学习和开发都有非常重要的意义。

大一c语言知识点思维导图

大一c语言知识点思维导图一. C语言概述C语言是一种广泛应用于系统编程和应用软件开发的高级编程语言。

它于1972年由贝尔实验室的Dennis Ritchie开发而成,原本被设计用于Unix操作系统的开发。

由于其简洁、高效和可移植性等特点,C语言迅速成为一种流行的编程语言,并逐渐演化出了许多其他编程语言的基础。

二. 基本语法1. 数据类型- 基本数据类型:整型、浮点型、字符型等- 派生数据类型:数组、结构体、指针、枚举等2. 变量与常量- 变量的声明与定义- 常量的定义与使用3. 运算符与表达式- 算术运算、关系运算、逻辑运算等- 表达式的构成和求值4. 控制结构- 顺序结构- 选择结构:if语句、switch语句 - 循环结构:while循环、for循环5. 函数与库函数- 函数的定义与调用- 标准库函数的使用三. 输入与输出1. 标准输入输出- printf()函数:格式化输出- scanf()函数:格式化输入2. 文件输入输出- 文件的打开与关闭- 文件的读写操作四. 数组与字符串1. 数组的定义与初始化2. 一维数组与二维数组的使用3. 字符串的基本操作- 字符串的输入与输出- 字符串的比较与拼接五. 结构体与指针1. 结构体的定义与使用2. 结构体数组与指针的操作3. 指针的基本概念和用法4. 动态内存分配与释放六. 文件操作1. 文件的打开与关闭2. 文件的读写操作3. 文件指针的定位和移动七. 递归与排序1. 递归的基本思想和应用2. 递归和循环的比较3. 常见排序算法的实现- 冒泡排序、选择排序、插入排序等八. 指针与函数1. 指针作为函数参数2. 指针作为函数返回值3. 函数指针的定义和使用九. 动态内存管理1. 堆和栈的区别2. malloc()和free()函数的使用3. 内存泄漏和内存溢出的问题十. 预处理器与多文件编程1. 头文件的作用与使用2. 宏定义的概念和用法3. 多文件编程的基本原理和实现方法十一. C语言标准库1. 字符串处理函数2. 文件操作函数3. 数学计算函数4. 日期和时间函数十二. 编程实践与常见问题1. 常见编程错误与调试技巧2. 编码规范与风格要求3. 代码优化与性能提升以上是大一C语言的知识点思维导图,通过系统地学习这些知识点,可以帮助初学者全面掌握C语言的基础知识,为日后的编程学习奠定扎实的基础。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

指针函数和函数指针的区别
这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又返回
类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。其定义格式
如下所示:

返回类型标识符 *返回名称(形式参数表)
{ 函数体 }

返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一
个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。
比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身
而已,而整个函数相当于一个“变量”。例如下面一个返回指针函数的例子:

#include
float *find();
main()
{
static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}};
float *p;
int i,m;
printf("Enter the number to be found:");
scanf("%d",&m);
printf("the score of NO.%d are:\n",m);
p=find(score,m);
for(i=0;i<4;i++)
printf("%5.2f\t",*(p+i));
}

float *find(float(*pionter)[4],int n)/*定义指针函数*/
{
float *pt;
pt=*(pionter+n);
return(pt);
}

学生学号从0号算起,函数find()被定义为指针函数,起形参pointer是指针指向包含4
个元素的一维数组的指针变量。pointer+1指向score的第一行。*(pointer+1)指向第一行的
第0个元素。pt是一个指针变量,它指向浮点型变量。main()函数中调用find()函数,将score
数组的首地址传给pointer.

2,“函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变
量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所
述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了
指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,
在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的说明方法为:
数据类型标志符 (*指针变量名)(参数);注:函数括号中的参数可有可无,视情况而定。
下面的程序说明了函数指针调用函数的方法:
#include
int max(int x,int y){ return(x>y?x:y); }
void main()
{
int (*ptr)();
int a,b,c;
ptr=max;
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}

ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的
入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,
不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像怎么
做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可
以先后指向不同的函数,不过注意,指向函数的指针变量没有++和--运算,用时要小心。

相关文档
最新文档