指针的一些自我理解
- 格式:docx
- 大小:27.63 KB
- 文档页数:10
什么是函数指针(理解及使用)
函数指针是指指向函数的指针变量。
函数指针可以像一般指针那样引
用函数。
它可以把函数的调用和实现分开,从而使我们可以在不改变函数
定义的情况下改变函数的调用方式。
函数指针的定义
returntype(*ptr)(argument list);
其中,ReturnType是函数返回类型,也是指针变量的数据类型,ptr 是指针变量的变量名,argument list 是函数参数列表。
函数指针的使用
函数指针可以像一般指针那样,使用指针运算符来引用函数。
以下是
一个函数指针的初始化:
int (*pf)(int, int);
这里,pf 是一个函数指针,它指向一个含有两个 int 型参数的函数,它的返回类型是 int。
在调用函数时,可以使用函数指针:
int x, y;
int sum;
sum = pf(x,y);
也可以使用函数名调用函数:
sum = func(x,y);
上述两种方式在执行上是没有区别的,它们可以互换使用。
通过函数指针可以分离函数的调用与实现,这让我们可以在不改变函数名的情况下,改变程序的调用方式。
例如,可以使用函数指针实现函数重载,也可以使用函数指针来实现在运行时动态选择函数,如下所示:int (*pf)(int, int);
void selectfunc
int a;
//获取一些参数
if (a == 0)。
名词解释钟表的隐喻钟表,作为人类文明历史上最早的时间测量工具之一,自古以来就承载着人们对时间流逝的观察和感知。
然而,除了用来测量时间的实用功能外,钟表也具有深刻的隐喻意义,可以解读为人生的象征。
本文将从不同角度深入探讨钟表的隐喻,探究其在人生中的重要性。
第一部分:时间的尺度时间,作为人类存在的基本维度,是一种无法触摸却无处不在的实体。
而钟表在此过程中充当了一种量化、可见的工具,帮助我们测量和感知时间的流逝。
这种量化的方式为人们提供了一份秩序和结构,使我们能够更好地组织自己的生活。
钟表不仅仅是时间测量工具,更是一种精确的尺度,将无限的时间切割成一段段有限的快慢。
它告诉我们,时间并非漫长无边的存在,而是可以被度量、计算和规划的。
第二部分:钟表与生活在日常生活中,钟表不仅帮助我们追逐时间,还引导着我们的节奏和行为方式。
无论是工作、学习还是娱乐,我们都会根据钟表上的指针和数字来安排自己的活动。
钟表就像一个沟通时间和人的桥梁,透过它,人们跨越时空的障碍,将过去、现在和未来联系在一起。
我们依赖钟表的存在,使得我们的生活更加规整、有序。
然而,钟表的存在也暗示着时间的限制与迫切性。
每一次指针的移动,都在提醒我们时间的流逝,不可逆转的事实。
我们时常会感到时间紧迫,时刻提醒自己要珍惜每一刻。
钟表的存在让我们意识到时间宝贵且有限,推动着我们积极地与时间赛跑。
第三部分:钟表与自我认知除了对时间的感知和生活的指引,钟表也可以被视为对自我认知的一种隐喻。
指针的不断旋转不仅是一个时间的流逝,也代表着人们的成长和变化。
我们每一次目光落在钟表上,都可以看到不同的数字,提醒我们自身的演变和发展。
钟表也是衡量个人努力和成就的标尺。
我们可以将自己的成长看作钟表指针的进步,而一切努力和付出则是使钟表持续前进的动力。
这种隐喻意义提醒着我们,人生的旅途并不是静止不动的,而是永无止境的成长和进步之旅。
最后,钟表还可以解读为对未来的期盼与担忧。
c语言指针的指针用法详解在C语言中,指针是非常重要的一种数据类型。
而指针的指针是指指向指针变量的指针。
它在C语言中也是非常重要的一种数据类型,经常用于动态内存分配和函数传递参数等方面。
下面,我们来详细介绍一下指针的指针在C语言中的用法。
一、指针的基本概念在C语言中,指针是一个变量,用来表示另一个变量的内存地址。
指针变量可以存储任何数据类型的地址,包括整型、字符型、浮点型等。
使用指针可以实现动态内存分配、函数传递参数等功能。
二、指针的指针的概念指针的指针是指指向指针变量的指针。
它的定义方式如下:```int **p;```其中,p是一个指向指针的指针变量,它可以指向一个指针变量的地址。
三、指针的指针的用法指针的指针在C语言中有很多用途,下面列举几个比较常见的用法。
1.动态内存分配在C语言中,可以使用malloc函数动态分配内存,该函数返回的是一个指向分配内存的首地址的指针。
而在一些情况下,需要动态分配二维数组或者指针数组,这时就需要使用指针的指针了。
例如:```int **p;int i,j;p=(int **)malloc(sizeof(int*)*3);//分配3个指向int类型指针的指针变量for(i=0;i<3;i++){p[i]=(int*)malloc(sizeof(int)*4);//分配4个int类型的变量}for(i=0;i<3;i++){for(j=0;j<4;j++){p[i][j]=i*j;//为p[i][j]赋值}}```上述代码中,先使用malloc函数分配3个指向int类型指针的变量,然后再用循环分别为这3个变量分配4个int类型的变量。
最后,再使用嵌套循环为二维数组赋值。
2.函数传递参数在C语言中,函数可以通过指针传递参数。
指针的指针也可以用于函数传递参数,可以使函数返回多个值。
例如:```void fun(int **p){*p=(int*)malloc(sizeof(int)*4);//为指针p分配4个int类型的变量(*p)[0]=10;(*p)[1]=20;(*p)[2]=30;(*p)[3]=40;}int main(){int *p;fun(&p);//传递p的地址printf("%d %d %d %d\n",p[0],p[1],p[2],p[3]);free(p);//释放内存return 0;}```上述代码中,定义了一个指针类型的函数fun,在函数中通过指针的指针为指针p分配4个int类型的变量,并为这4个变量赋值。
总结课:让你不再害怕指针指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。
0前言:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧:int p;//这是一个普通的整型变量int*p;//首先从P处开始,先与*结合,所以说明P是一//个指针,然后再与int结合,说明指针所指向//的内容的类型为int型.所以P是一个返回整//型数据的指针int p[3];//首先从P处开始,先与[]结合,说明P是一个数//组,然后与int结合,说明数组里的元素是整//型的,所以P是一个由整型数据组成的数组int*p[3];//首先从P处开始,先与[]结合,因为其优先级//比*高,所以P是一个数组,然后再与*结合,说明//数组里的元素是指针类型,然后再与int结合,//说明指针所指向的内容的类型是整型的,所以//P是一个由返回整型数据的指针所组成的数组int(*p)[3];//首先从P处开始,先与*结合,说明P是一个指针//然后再与[]结合(与"()"这步可以忽略,只是为//了改变优先级),说明指针所指向的内容是一个//数组,然后再与int 结合,说明数组里的元素是//整型的.所以P 是一个指向由整型数据组成的数//组的指针int**p;//首先从P开始,先与*结合,说是P是一个指针,然//后再与*结合,说明指针所指向的元素是指针,然//后再与int 结合,说明该指针所指向的元素是整//型数据.由于二级指针以及更高级的指针极少用//在复杂的类型中,所以后面更复杂的类型我们就//不考虑多级指针了,最多只考虑一级指针.int p(int);//从P处起,先与()结合,说明P是一个函数,然后进入//()里分析,说明该函数有一个整型变量的参数//然后再与外面的int结合,说明函数的返回值是//一个整型数据int(*p)(int);//从P处开始,先与指针结合,说明P是一个指针,然后与//()结合,说明指针指向的是一个函数,然后再与()里的//int结合,说明函数有一个int型的参数,再与最外层的//int结合,说明函数的返回类型是整型,所以P是一个指//向有一个整型参数且返回类型为整型的函数的指针int*(*p(int))[3];//可以先跳过,不看这个类型,过于复杂//从P开始,先与()结合,说明P是一个函数,然后进//入()里面,与int结合,说明函数有一个整型变量//参数,然后再与外面的*结合,说明函数返回的是//一个指针,,然后到最外面一层,先与[]结合,说明//返回的指针指向的是一个数组,然后再与*结合,说//明数组里的元素是指针,然后再与int结合,说明指//针指向的内容是整型数据.所以P是一个参数为一个//整数据且返回一个指向由整型指针变量组成的数组//的指针变量的函数.说到这里也就差不多了,我们的任务也就这么多,理解了这几个类型,其它的类型对我们来说也是小菜了,不过我们一般不会用太复杂的类型,那样会大大减小程序的可读性,请慎用,这上面的几种类型已经足够我们用了.1、细说指针指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
c语言指针教学中的知识点分析与总结c语言指针教学中的知识点分析与总结本文对c语言指针的教学进行了探讨和总结。
要想真正的掌握c 语言的指针,首先必须要对它有全面深刻的认识。
因为它是c语言的基础,只有将指针的知识学好,才能够更好地学习后续的课程。
下面小编给大家介绍一下关于c语言指针的知识。
一、 c语言中指针的定义指针是一种特殊的数据类型,也称为引用类型。
所谓指针就是指向一个地址的变量,例如: int a[10];二、变量指针及指针变量1.1 c语言中的变量。
变量是存储在计算机中的二进制数值,当我们需要使用时,必须创建一个变量并赋予它相应的值,然后将变量的地址传递给外部的一个或多个对象,这样外部对象通过访问内部变量来使用其中存储的信息,而且可以保证外部对象不会越界。
1.2指针变量是变量的一种特殊形式,指针变量在内存中占有一块区域,可以指向一个地址,这个地址的值是这个变量所代表的值,这样方便变量间的传递。
例如: char *a[10];2.1指针操作符2.2指针数组,它的作用和一维数组相同,即具有一维数组的特点,也具有二维数组的特点,三者最明显的区别就是二维数组中元素个数是固定的,而一维数组中元素个数是可变的。
2.3指针的运算规则。
在指针变量的操作中,要遵循以下运算规则:原地址→指针地址。
例如: char * a[10]; 2.4 c语言中的const指针常量是一种特殊的指针常量, const不是一种变量的标准类型,它专门用于指向一个const指针。
2.3指针的运算规则。
在指针变量的操作中,要遵循以下运算规则:原地址→指针地址。
例如: char *a[10];2.4指针的定义与使用:所谓指针就是指向一个地址的变量,例如: int a[10]; 2.4指针的定义与使用: pointer, pointer-pointer,and-and-and。
所以,当我们在一个字符串中出现pointer,pointer-pointer, and-and-and的时候,就表示它指向一个地址。
c语言中的指针详解在C语言中,指针是一种特殊的变量类型,它存储了一个变量的内存地址。
通过指针,我们可以间接访问和修改内存中的数据,这对于一些需要动态分配内存的操作非常有用。
以下是关于C语言指针的一些详细解释:1. 定义指针:使用"*"符号来定义指针变量。
例如,int* ptr; 定义了一个指向整型变量的指针 ptr。
2. 取址操作符(&):取地址操作符(&)用于获取变量的内存地址。
例如,&a 返回变量 a 的地址。
3. 解引用操作符(*):解引用操作符(*)用于访问指针所指向的变量的值。
例如,*ptr 返回指针 ptr 所指向的整型变量的值。
4. 动态内存分配:可以使用相关的库函数(如malloc和calloc)在运行时动态分配内存。
分配的内存可以通过指针来访问和使用,并且在使用完后应该使用free函数将其释放。
5. 空指针:空指针是一个特殊的指针值,表示指针不指向任何有效的内存地址。
可以将指针初始化为NULL来表示空指针。
6. 指针和数组:指针和数组在C语言中有密切的关系。
可以通过指针来访问数组元素,并且可以使用指针进行指针算术运算来遍历数组。
7. 传递指针给函数:可以将指针作为函数参数传递,以便在函数内部修改实际参数的值。
这种传递方式可以避免拷贝大量的数据,提高程序的效率。
8. 指针和字符串:字符串在C语言中实际上是以字符数组的形式表示的。
可以使用指针来访问和操作字符串。
需要注意的是,指针在使用时需要小心,因为不正确的操作可能导致程序崩溃或产生不可预料的结果。
对于初学者来说,理解指针的概念和使用方法可能需要一些时间和练习。
计算机复试面试自我介绍各位老师好,我很荣幸能参加今天的计算机复试面试。
我是一个对计算机充满无限热爱的人。
从接触计算机的第一眼起,就被它的神奇深深吸引住了。
我比较喜欢探寻计算机领域当中各个分支的知识,不管是编程代码背后逻辑的构建,还是计算机硬件那精密的架构。
我在大学期间,有过一些让我成长的经历。
我记得刚开始学习编程语言的时候,那是C语言。
当时,光是理解那些复杂的语法和数据类型就觉得头疼,比如指针这个概念,对于初学者的我来说就像一团迷雾。
但是我不服输,我就花大量的时间去研究书本里的示例代码,一个字符一个字符去解读,自己动手改代码,看不同的修改会出现什么样的结果。
经过不断地尝试,终于掌握了指针的精髓。
这个经历让我懂得,在计算机学习这条路上,只要有耐心和毅力,就没有克服不了的困难。
我的特点是比较善于自学。
在学习计算机知识的时候,课堂上的信息往往是有限的。
我会利用课余时间在网上搜索各种优质的计算机课程资源。
像Coursera和网易云课堂上的相关计算机课程,我都有去学习过。
有的课程关于数据挖掘的内容特别深入,有些艰涩,我就会不断地记笔记,反复看视频,去图书馆找相关的书籍资料辅助理解。
印象最深的是一次参加校园编程大赛的经历。
当时和队友们一起为了个项目熬了好几个通宵。
我们做的是一个小型的校园信息管理系统,从需求分析、架构设计到代码的具体实现,每一步都充满挑战。
比如在设计数据库结构的时候,因为要考虑到学校不同部门的数据交互和权限管理,逻辑相当复杂。
我们就不断画流程图,讨论每种方案的优劣。
这次经历不仅让我提升了自己的编程能力,还让我学会了团队协作,懂得如何在团队中发挥自己的优势,怎样去听取和接纳别人的意见。
另外,我对新知识的接受能力也比较强。
平时遇到新颖的计算机技术,像现在特别热门的人工智能领域里的新算法,我都愿意去了解,即便理解起来可能有些吃力,但那种探索新知识的感觉很美妙。
总的来说,我非常期待能够在这个新的学习阶段,在计算机这个领域不断深入挖掘,和各位老师以及优秀的同学们一起探索和成长。
C语言指针详解1 程序如何运行当我们打开电脑中的任何一个程序运行时,我们的操作系统会将该程序存在硬盘的所有数据装载到内存中,然后有CPU 进行读取内存中的数据并进行计算,并将计算的结果返回给我们的操作系统,然后操作系统将相应的动作交付给相应的硬件来完成。
如:将声音数据交给声卡,最后有音响输出来,将图像交给显卡最后有显示器输出……但是还会有一部分数据会返回给内存,以供程序下面的语句继续使用。
我们都知道内存的容量有很大,如:4G,8G, 16G,有时候我们会打开很多的程序,所有的程序的数据都存放到我们的内存中,那么CPU是如何正确的读取我们的不同程序的数据并加以计算的哪?2 内存的假设设计为了让我们的CPU 可以很好的读取内存中的数据,内存必须做优化设计,于是给内存设定了集合设计,将我们的内存分成很多大小相同的方格(盒子),所有的数据将放入这些小盒子中,将不同的程序的数据放入到不同的小盒子中,这样就出现的模块化的内存,当我执行程序的一个命令时,CPU就会从相应的盒子读数据然后计算,由于我们硬件所能访问或计算的最小单位是字节,所以内存中的这样的一个小盒子的大小就给他规定一个字节。
3 地址和指针一般我们声明一块内存空间的时候,会给他取一个名字,为的是我们在编写程序的时候方便使用空间中存放的值,但是CPU 读数据的时候会忽视这个名字,因为CPU无法理解这样的数据,CPU 只能执行0,1代码,那么CPU是如何知道从什么地方读取数据,又到什么地方地址数据的读取的那,所以必须对内存做2次设计,就是将内存中分成的很多小盒子下面标注一些顺序的序号,例如:从第一个盒子开始,标注1,2,3,4,5,6,7,……每一个数字对应一个盒子,但是真正的内存如中不是使用这些十进制数字的,而是使用16进制整数表示的,如0x16ffee。
这些我们标记的数字就叫做内存中的地址。
由于这些地址和盒子是对应的关系,所以只要知道了地址,就可以得到对应盒子中存放的数据了,形象的说,我们说这个地址指向对应的盒子,在C语言中可以通过地址得到对应盒子的数据是*地址。
时针: 我是时针,我是钟表上最短的针,代表着时间的流逝和变化。
我的运动速度相对较慢,每小时只能走过钟盘的一个小格,但我负责指示当前的小时数,是钟表中最重要的指针之一。
分针: 我是分针,相比时针更长一些,也更快一些。
我的主要任务是指示当前的分钟数,每小时走过钟盘一圈,代表着时间的精确流逝。
我和时针一起协作,共同指示出当前的时间。
秒针: 我是秒针,是钟表上最细、最快的针。
我每分钟要走过钟盘一圈,代表着时间的流逝是最快的。
虽然我的角速度最大,但我的作用是指示秒数,是时间中最短暂的单位。
我和时针、分针一起构成了完整的时间显示系统。
c语言中什么是指针指针一般指向一个函数或一个变量。
在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的函数的值。
在计算机语言中,由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。
因此,将地址形象化的称为“指针”。
意思是通过它能找到以它为地址的内存单元。
1:指针是一个地址,指向的是个类型:我们知道,c语言中的类型有int,char,bool(这个不常用),一般我们使用int,char就可以满足一般的类型需求的,如果对于变量的长度过大,就是用long ,float,double,关于各个类型使用的的长度问题,可以使用sizeof(int)或者sizeof(long)来查看各个类型,在系统中的小。
而指针就是一个8个字节(64系统)。
2:指针指向的是地址,地址指向的是内容:我们需要一个变量,来存储地址,这个变量的值是地址,但是我们可以通过修改变量的值,来不断的改变地址,但是,我们如果需要改变该个地址的值的话,就需要,对地址的值进行修改,而不改变地址。
int a = 10;int *p ;p = &a;*p =11;a=?这里我们看到,p 是一个变量,我们使用p来存储变量a的地址,这是,我们使用*p对于这个变量进行赋值,那么a的值最后,是多少呢,结果是11,因为我们使用*p赋值,就相当于a=11,赋值效果一样的。
3:指针的指针,是面对于指针的变量:我们说,指针的指针的时候,就有点不清楚了,到底怎么区分指针和指针的指针呢。
char *p;char **pr;pr = &p;我们这样看就清楚了一点,char *(*pr); *pr是一个存储的值为指针的变量,pr就是存储上个变量地址的变量。
整合起来就是,pr是一个存储的值为指针的地址的变量。
这样,我们就基本,对于指针有一个直接的了解了。
指针(重中之重)指针的重要性表示一些复杂的数据结构快速的传递数据,减少了内存的耗用【重点】能直接访问硬件(地址就放在硬件中)是理解面向对象语言中引用的基础使函数返回一个以上的值(无指针时return是结束被调函数,只能返回一个值)总结:指针是c语言的灵魂指针的定义地址:内存单元的编号(一个内存单元就是一个编号也是是一个字节:8位)从零开始的非负整数范围:4G【0—4G-1】指针:指针就是地址,地址就是指针指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量指针变量也叫地址变量,专门存放地址,不能存放某个实数,只能赋地址值指针和指针变量是两个不同的概念指针是存储单元地址,是个值,只不过这个值是内存单元的编号,是常量指针变量是存放存储单元地址的变量,能被赋予不同的指针值,有好多好多类型但是要注意:通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样指针的本质就是一个操作受限的非负整数指针的分类:1、基本类型指针【重点】#include<stdio.h>int main(void){int *p;/*1、p是变量的名字,int *表示p变量存放的是int类型变量的地址2、int *p;不表示定义了一个名字叫做*p的变量3、int *p应该这样理解:p是变量名,p变量的数据类型是int *型所谓的int *类型实际就是存放int型的普通变量地址的类型,这个int *型与int型是两个不同的数据类型,这点应该特别注意4、p=i;(×),p=&i(√)*/int i=3;int j;//p=i;//error 因为类型不一致,p只能存放int类型变量的地址,不能存放int 类型变量的值//p=55;//error 原因同上p=&i;} /*1、p保存了i的地址,应因此p指向i2、p不是i,i也不是p,更准确的说:修改p的值不影响i的值,修改i的值也不影响p的值3、如果一个指针变量指向了一个普通变量,则*指针变量就完全等同于普通变量例子:如果p是个指针变量,并且p存放了普通变量i的地址则p指向了普通变量i*p 就完全等同于i,换句话说*p与i就是同一个东西,*p所代表的为p所指向的那个变量(一个存放普通类型值的变量或者单元或者说一个普通的箱子)也可以理解为相当于一个宏定义的性质的东西或者说:在所有出现*p的地方都可以替换成i在所有出现i的地方都可以替换成*p4、*p最准确的解释:*p表示的是以p的内容(i的地址)为地址的变量(*p还是变量)*p等同于i5、&与*优先级相同,且有从左到右的结合性所以&*p,&(*p)和&i三者是等价的,*&i,*(&i)和i 三者是等价的,*&i(p=&I,*p=i)即是i本身*/j=*p;//等价于j=iprintf("i=%d,j=%d\n",i,j);//i=3,j=3return 0;}2、基本类型指针常见错误解析:例子1#include <stdio.h>int main(){int *p; //第四行int i=5;*p=i; //有问题(第六行)printf("%d\n",*p);return 0;}/*此程序是错误的。
1、*p表示以p的内容为地址的变量,第六行有问题因为p应先指向一个东西才可以把值赋给它,但此地p并没有指向i。
2、此地品不是没有指向,p是有指向的,如果p没指向,那么p里面应是空的,但此地的p中有一个值,只不过是个垃圾值。
3、第四行我们定义了一个指针变量p,它是个局部变量,局部变量如果不初始化,它里面是个垃圾值,它也是个值。
通常情况下只要是个值就会有以这个值为地址的那个单元。
4、不管p中是什么内容,*p它也是个变量,p有指向,*p是以p中这个垃圾值(未知的二进制代码)为地址的一个未知的单元,那么*p就代表着我们不知道的一个单元。
5、i的值是5,最终结果是你把5赋给一个你所不知道的一个单元。
或者说我们这个程序只给你分配了两个空间,一个是p的空间,一个是i的空间,但你这个程序运行的过程当中你用一个5修改了一个不属于你的一个单元,所以程序有错,但这个东西很隐晦,在编译时不会报错,但运行时会弹出错误窗口。
总结:我们写程序是与内存打交道,如果一个程序叫A,如果A程序运行起来我们的系统给它分配2块空间,我们只能使用这两个空间,但是你在用这两个空间的同时你又把一个人家没分配给你的空间的值给改了或者把它的内存给读出来了,这样写的话严格来讲就出错了,如果不出错的话这个就是病毒一样的性质,这样的话就有可能你在运行这个程序的同时把原来正常的程序中的某些重要的参数或值改了而导致系统崩溃。
*/例子2:#include <stdio.h>int main(){int i=5;int *p;int *q;p=&i;//*q=p;//*q中也是个垃圾值(第8行)error 语法错误//*q=*p;//error 原因同上例p=q;//q是垃圾值,q赋给p,p也变成垃圾值printf("%d\n",*q);//13行/*q的空间是属于本程序的,所以本程序可以读写q的内容,但是如果q内部是垃圾值,本程序不能读写*q的内容,因为此时*q所代表的内存单元的控制权限并没有分配给本程序,所以本程序运行到13行时会立即出错*/return 0;}/*此程序是错误的。
1、语法错误*q的数据类型是整型(int),*q代表的是q所指向的那个整型变量,而p是int *型,两者数据类型不一致,之间不能赋值。
所以有语法错误,编译时不能通过。
而上一个例子之所以能通过是因为它没有语法错误,*p是int型,i也是int型,*p=i;是没有语法错误的。
2、如果把第8行改成*q=*p语法没错,但程序是错的,因为q没赋值,原因同上例。
如果改成p=q;把q赋给p,那么*q还是个垃圾值,但严格讲不是垃圾值,因为q本身是个垃圾值无所谓,因为q的空间是属于自己的,我们可以使用q,可以读或写,q中是垃圾值,是我们这个程序自己可能控制的,但后面的*q就不对了,*q所代表是我们未知的一个单元,不能读里面的内容(内存保护)。
*//*经典指针程序—互换2个数字*/#include <stdio.h>void swap_1(int ,int );void swap_2(int *,int *);void swap_3(int *,int *);int main(void){int a=3,b=5;swap_3(&a,&b);printf("a=%d,b=%d\n",a,b);}/*不能完成互换功能,因为形参值的改变不能使实参的值改变*/void swap_1(int a,int b){int t;t=a;a=b;b=t;}/*不能完成互换功能,只是把p与q的值该了,a与b的地址是分配好的,改不了,同时a与b的内容也没变,原因同swap_1*/void swap_2(int *p,int *q){int *t;//如果要互换p和q的值,t必须是int *型,不能是int,否则会出错t=p;p=q;q=t;}/*能完成互换功能,p指向a,q指向把,*p就是a(main中的a)*q就是b(main中的b)所以我们互换*p与*q的值就会改变main函数中的a与b*/void swap_3(int *p,int *q){//也可以不用变量t,直接在子函数中给*p和*q赋具体的值从而改变主函数中a与b的值int t;//如果要互换*p与*q的值,t必须是int型,不能定义为int *,否则出错t=*p;//p是int *型,*p是int*p=*q;*q=t;}附注:*的含义1、乘法2、定义指针变量int *p//定义了一个名字叫p的变量,int *表示p只能存放int变量地址3、指针运算符该运算符放在已经定义好的指针变量的前面如果p是一个已经定义好的指针变量则*p表示以p的内容为地址的变量问题:如何通过被调函数修改主函数中普通变量的值?1、实参必须为该普通变量的地址2、形参必须为指针变量3、在被调函数中通过*形参名=……的方式就可以修改主调函数相关变量的值eg:int a=3;b=5;(main中的)*p=5;*q=3;(子函数中的过程)在主函数中输出a与b的值时a=5;b=3;如果想修改多个普通变量的值就把多个普通变量的地址发过去就可以使函数返回一个以上的值。
3、指针与数组:指针与一维数组一维数组名:一维数组名是个指针常量,它存放的是一维数组第一个元素的地址。
eg:#include <stdio.h>int main(void){int a[5];int b[5];//a=b;//error a和b是数组名,是个指针常量,常量间不能赋值,否则常量值就变了,就不是常量printf("%#x\n",&a[0]);//把一个数以16进制输出是用%#xprintf("%#x\n",a);//把数组名a的值输出看一下是否是数组a首元素的址}/*在VC++6.0中的输出结果--------------------------0x18ff340x18ff34press any key to continue--------------------------总结:一维数组名:一维数组名是个指针常量,它存放的是一维数组第一个元素的地址。
*/下标和指针的关系:如果p是个指针变量,则p+i指向p[i],p+i存放的是p[i]的地址,那么:p[i]永远等价于*(p+i)。
确定一个一维数组需要几个参数【如果一个函数要处理一个一维数组,则需要接受该数组的哪些信息】需要两个参数:数组第一个元素的地址数组的长度eg:#include<stdio.h>void f(int *pArr,int len)//可以输出任何一个数组的内容{int i;//*pArr//就是a[0]这个元素//*(pArr+1)//就是a[1]这个元素for(i=0;i<len;i++)printf("%2d",*(pArr+i));//*pArr *(pArr+1) *(pArr+2)printf("\n");}int main(void){int a[5]={1,2,3,4,5};int b[6]={-1,-2,-3,4,5,-6};f(a,5);//a是int *型,是数组a首元素地址相当于&a[0]f(b,6);}/*在VC++6.0中的输出结果--------------------------1 2 3 4 5-1 -2 -3 4 5 -6press any key to continue--------------------------*/问题明确:上例中子函数又没有返回任何值,为什么*pArr就是我们数组中的内容?一定要明白7行的pArr[3]和12行14行的a[3]是同一个变量*/#include<stdio.h>void f(int *pArr,int len)//可以输出任何一个数组的内容{pArr[3]=88;//等价于*(pArr+3)//7行}int main(void){int a[6]={1,2,3,4,5,6};printf("%d\n",a[3]);//一定是4//12行f(a,6);printf("%d\n",a[3]);//a[3]也等价于*(a+3),结果是88//14行}/*在VC++6.0中的输出结果--------------------------488press any key to continue--------------------------*//*分析:(1) a本身代表&a[0],你把a发送给pArr那么pArr的值与a的值一样那么pArr也是&a[0]。