C语言指针教学中的知识点分析与总结-最新教育文档
C语言指针学习总结

C语⾔指针学习总结上学的时候学习C语⾔,最烦的就是⾥⾯指针,可是指针也恰恰是C语⾔的灵魂。
最近在重温数据结构的内容,因为⼤多数据结构的教材都是⽤C语⾔描述的,⽽数据结构中也⼤量的⽤到了指针的内容,所以我就在这篇笔记中记录⼀下我这周复习C语⾔的⼼得。
先看看百科上对指针的描述。
在计算机科学中,指针(Pointer)是编程语⾔中的⼀个对象,利⽤地址,它的值直接指向(points to)存在计算机存储器中另⼀个地⽅的值。
由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。
因此,将地址形象化的称为“指针”。
意思是通过它能找到以它为地址的内存单元。
作个⽐喻,假设将计算机存储器当成⼀本书,⼀张内容记录了某个页码加上⾏号的便利贴,可以被当成是⼀个指向特定页⾯的指针;根据便利粘贴⾯的页码与⾏号,翻到那个页⾯,把那个页⾯的那⼀⾏⽂字读出来,这就是指针的作⽤。
下⾯将通过⼀些代码说明指针在C语⾔中的表现形式。
int main(){int a ;a = 10;int *p;p = &a;}如果⽤图⽚描述这段代码,就是下⾯这个样⼦。
怎么来理解呢?⾸先这段代码⾥通过int a和int *p定义了两个变量:分别是p和a,p变量与a变量的定义⽅式有⼀些不同,a变量就是C语⾔中⼀个很普通的int型变量,通过a=10将10这个整型赋值给了a。
⽽p变量的定义前⾯有⼀个 * ,这个 * 表明了p变量是⼀个指针变量,指针变量⾥⾯只能存放地址,这个地址是内存中的某个位置,在上⾯的代码中我们在p变量⾥⾯存放的是0x2C406B24这个地址,这个地址⾥⾯存放的值必须是int值,在我们这⾥,p变量⾥⾯存放的地址是a变量的地址,a变量在定义时就是⼀个int,所以是符合要求的。
这样⼀来,我们就说p变量指向了a变量,p = &a这句代码完成了p指向a的这个操作。
这⾥没有写p = a,那是因为p变量需要的是⼀个地址,⽽不是a变量⾥⾯存放的值,所以&这个操作符就是取地址的意思,通过&a取到a变量在内存中的地址,将地址赋值给p指针变量,就使p指向了a。
C语言指针教学重点和难点问题浅析

C语言指针教学重点和难点问题浅析一、教学重点1. 指针的概念和基本语法指针是C语言中的一个重要概念,它是存储其他变量地址的变量。
在介绍指针的概念时,需要着重强调指针变量和指针地址的概念,并且让学生能够理解指针变量中存储的是其他变量的地址。
需要讲解指针变量的声明和基本语法,包括指针变量的定义、取地址运算符&和解引用运算符*的使用等。
2. 指针和数组的关系指针与数组是C语言中的两个重要概念,它们之间有着密切的关系。
在教学中需要说明指针和数组的关系,包括数组名即为数组首元素地址、指针与数组名的关系以及指针和数组的相互转换等。
这对于学生理解指针的概念和用法是非常重要的。
指针在C语言中与函数有着密切的联系,通过指针参数可以实现函数的参数传递和返回多个值等功能。
在教学中需要重点介绍指针作为函数参数的用法,包括指针作为参数的函数声明和调用、指针作为函数返回值的用法等。
4. 指针和动态内存分配动态内存分配是C语言中一个重要的概念,也是指针的一个重要应用。
在教学中需要说明动态内存分配的概念和使用方法,包括用malloc、calloc和realloc等函数动态分配内存,以及用free函数释放动态分配的内存。
需要强调动态内存分配的过程中需要注意内存泄漏和内存溢出等问题。
1. 指针的复杂性指针作为C语言中的一个重要概念,其本身的复杂性是教学的一个难点。
指针的概念抽象,对初学者来说不容易理解和掌握,尤其是对于没有编程经验的学生来说更是一项挑战。
在教学中需要采用生动形象的比喻和例子,让学生可以通过具体的例子理解指针的概念和用法。
指针的使用很容易导致内存管理方面的问题,比如内存泄漏、野指针等。
这些问题对于学生来说是一个较大的难点,在教学中需要重点讲解指针导致的内存管理问题,比如动态内存分配和释放等,以及如何避免和解决这些问题。
三、教学方法针对上述教学重点和难点,教师可以采用以下教学方法:1. 生动形象的比喻和例子在教学中可以采用生动形象的比喻和例子,让学生通过具体的例子理解抽象的概念,比如用指针来比喻门牌号、邮政编码等,让学生理解指针的概念和用法。
C语言中指针重要知识点

C语言中指针重要知识点C语言中,指针是一种特殊的数据类型,它存储了一个变量的地址。
通过使用指针,可以直接访问存储在内存中的变量值,以及动态分配内存和管理数据结构等。
指针的重要知识点包括以下内容:2.指针的解引用:通过指针,可以间接访问存储在指针所指向的内存地址中的数据。
解引用操作使用“*”符号,例如,*p可以访问p指针所指向的整型变量的值。
3.指针和数组:数组名本身就是指向数组第一个元素的指针。
通过指针可以对数组进行遍历、访问和修改元素等操作。
4.指针的算术运算:指针可以进行加法、减法等算术运算。
例如,p++将指针p向前移动一个元素的位置。
指针的算术运算通常用于遍历数组、字符串等数据结构。
5.指针与函数:在函数中使用指针参数可以避免复制大量的数据,提高程序的执行效率。
通过指针参数,函数可以修改实参的值。
6. 动态内存分配:动态内存分配是指在程序运行时根据需要对内存进行分配和释放。
在C语言中,通过使用动态内存分配函数(如malloc、calloc、realloc等)来动态分配内存空间,并使用指针来管理和访问这些内存空间。
7.空指针和野指针:空指针是指没有指向任何有效的内存地址的指针,使用时需要判断指针是否为NULL。
野指针是指指向一个未知或无效地址的指针,使用时可能会产生程序错误。
8.指针与字符串:在C语言中,字符串实际上就是以空字符'\0'结尾的字符数组。
可以通过使用指针来访问和操作字符串,例如,通过指针遍历字符串、拷贝字符串、比较字符串等。
9.指针和结构体:结构体是一种用户自定义的数据类型,可以包含多个不同类型的成员。
通过使用指针可以动态创建和操作结构体对象,传递结构体指针可以避免大量的数据复制。
10.指针和多维数组:可以通过指针来访问和操作多维数组。
多维数组在内存中是一维线性存储的,指针可以根据数组的行列数计算出元素的位置。
以上是C语言中指针的重要知识点。
掌握指针的相关内容,可以提高程序的灵活性和效率,特别是在处理动态数据结构和内存分配方面。
c语言指针知识点实验总结

c语言指针知识点实验总结C语言指针是一种重要的编程概念,而掌握指针的知识对于提高代码的效率和灵活性至关重要。
本文将对C语言指针的知识点进行实验总结,帮助读者更好地理解和应用指针。
1. 指针的定义和基本概念指针是一种变量,它存储着一个内存地址,这个地址对应着存储的数据。
通过指针,我们可以直接访问和操作内存中的数据,提高程序的效率和灵活性。
在C语言中,我们使用"*"来声明指针变量。
2. 指针的使用方法使用指针的第一步是声明指针变量,并且将它指向一个合法的内存地址。
为了确保指针的有效性,我们可以使用取地址符"&"获取变量的地址。
通过指针,我们可以访问存储在该地址上的数据,可以使用"*"来解引用指针,获取或修改指针指向的数据。
3. 指针和数组的关系数组名在C语言中可以被视为指向数组首元素的指针。
通过指针算术运算,我们可以便捷地访问数组中的不同元素,实现数组的遍历和操作。
4. 指针和函数的关系通过指针,我们可以将函数的地址作为参数进行传递。
这样的参数被称为函数指针,通过函数指针,我们可以灵活地在程序中调用不同的函数,实现更加通用和可复用的代码。
5. 指针的动态内存分配C语言提供了动态内存分配的机制,即通过指针在运行时申请内存空间。
使用动态内存分配可以避免静态内存不足的问题,同时也提高了内存的利用效率。
需要注意的是,在使用完毕后,我们必须手动释放被分配的内存。
6. 指针的常见问题和注意事项在使用指针的过程中,我们需要注意指针的有效性、指针的赋值和修改、指针的比较以及指针的空指针问题等。
对于指针操作的不当,可能导致程序的崩溃或者产生错误的结果。
通过实验总结,我们深入探讨了C语言指针的相关知识点。
掌握了指针的定义和基本概念,了解了指针的使用方法,学习了指针和数组、函数的关系,熟悉了指针的动态内存分配,同时也了解了指针的常见问题和注意事项。
通过对C语言指针的综合学习,读者将能够更加灵活地运用指针,提高程序的效率和可维护性。
C语言指针详细讲解

类型转换错误
01 总结词
类型转换错误是指试图将一个类型的指针 转换为另一个类型,导致程序崩溃或未定 义行为。
02 详细描述
类型转换错误通常发生在以下情况
03
1. 强制类型转换
04
强制类型转换是一种不安全的操作,它可能 会导致内存访问错误或程序崩溃。例如,将 一个int类型的指针强制转换为char类型的 指针,然后试图访问该地址,可能会导致程 序崩溃。
指向void的指针的使用
01
什么是指向void的指针
指向void的指针是一个特殊类型的指针,它可以指向任何类型的数据,
但是不能直接对其进行操作。
02
为何使用指向void的指针
使用指向void的指针可以在不知道指针所指向的数据类型的情况下,传
递数据或函数的参数。
03
如何使用指向void的指针
在C语言中,可以使用void关键字定义一个指向void的指针。例如:
3
在C语言中,指针变量通常用"*"表示其类型。
指针的类型
指针的类型取决于它所指向的变量的类型。 如果指针指向一个浮点数,则该指针的类型为float *。
如果指针指向一个整数,则该指针的类型为int *。 如果指针指向一个字符,则该指针的类型为char *。
指针的变量
指针变量可以声明为任何类型,包括int 、float、char等。
c语言指针详细讲解
汇报人: 日期:
目 录
• c语言指针基本概念 • c语言指针的运算 • c语言指针与数组 • c语言指针与函数 • c语言指针的使用技巧与注意事项 • c语言指针常见错误分析
01
c语言指针基本概念
指针的定义
C语言指针要点总结

C语言指针要点总结C语言是一种面向过程的编程语言,而指针是C语言中的一个核心概念。
掌握指针的使用对于理解和运用C语言来说非常重要。
下面是C语言指针的一些要点总结:指针是一个变量,用于存储另一个变量的地址。
指针的声明使用*符号来标识,例如:int *ptr; 表示ptr是一个指向int类型的指针。
2.指针的初始化:指针在使用之前必须被初始化,可以通过直接赋值给指针变量、取地址符&,或者使用malloc函数(用于动态分配内存)来初始化指针。
3.指针的操作:3.1指针的解引用:解引用指针意味着访问指针指向的内存地址上的值。
可以使用*操作符来解引用指针,例如:*ptr 表示访问指针ptr指向的内存地址上的值。
3.2指针的递增和递减:指针可以通过递增和递减操作来指向相邻的内存地址。
递增操作使用++操作符,递减操作使用--操作符,例如:ptr++ 表示将指针ptr指向下一个内存地址。
4.指针的算术运算:指针支持算术运算,可以进行指针之间的加法、减法运算。
指针之间的加法运算会根据指针类型的大小来计算结果的地址。
5.数组和指针的关系:数组和指针在C语言中有着紧密的关系。
数组名本身就是一个指针,指向数组的第一个元素的地址。
可以使用指针来操作数组元素,例如:*(arr + i) 表示访问数组arr中的第i个元素。
6.指针作为函数参数:使用指针作为函数的参数,可以实现在函数中修改传入参数的值。
将参数声明为指针类型,可以直接修改参数所指向的内存地址上的值,而不仅仅是操作参数的副本。
7.动态内存分配:可以使用malloc函数来动态分配内存,返回一个指向所分配内存的指针。
动态内存分配可以在程序运行时根据需要进行内存分配和释放,这对于处理动态数据结构非常有用。
8.空指针和野指针:空指针表示指针不指向任何有效的内存地址,可以用NULL来表示。
野指针是指指针指向未初始化或已释放的内存地址,使用野指针是非常危险的,可能导致程序崩溃或非预期的行为。
c语言中指针的知识点

C 语言中指针是一种强大而灵活的工具,它允许直接访问和操作内存地址。
以下是一些关于 C 语言中指针的基本知识点:
1. 指针的定义和声明:
在 C 语言中,指针是一个变量,其值是一个内存地址。
指针可以指向不同的数据类型。
2. 取址操作符&:
&操作符用于获取变量的地址。
3. 间接引用操作符*:
*操作符用于访问指针所指向地址的值。
4. 空指针:
空指针是指未初始化的指针或者指向空地址的指针。
5. 指针的算术运算:
指针可以进行算术运算,如加法和减法。
指针的算术运算会根据指针指向的数据类型进行。
6. 指针和数组:
数组名本质上是一个指向数组首元素的常量指针。
7. 指针和函数:
指针可以作为函数参数,允许在函数中修改调用者的变量。
8. 指针和动态内存分配:
malloc和free函数用于动态内存的分配和释放。
这些是 C 语言中指针的一些基本知识点。
理解指针的使用和概念是学习 C 语言中的重要一步。
请注意,使用指针时要小心,确保不会出现悬空指针、内存泄漏等问题。
c语言指针总结

c语言指针总结C语言指针是一种强大而复杂的概念,对于初学者来说可能会感到困惑。
本文将总结C语言指针的定义、用法、特性以及常见问题,帮助读者更好地理解和应用指针。
一、指针的定义和用法:1. 定义:指针是一个变量,其值为另一个变量的地址。
可以通过指针来操作和引用存储在内存中的数据。
2. 用法:通过声明指针变量,可以将一个变量的地址赋值给指针,并通过解引用操作符‘*’来访问该地址上存储的值。
二、指针的特性:1. 指针的大小:不同类型的指针大小可能不同,但在同一平台上,所有指针的大小都固定。
2. 空指针:指针变量可以被赋值为空指针,即指向地址为0的位置。
空指针通常用来表示指针不指向任何有效的内存位置。
3. 野指针:未初始化或已经释放的指针称为野指针。
野指针可能指向任意内存位置,不可控制,因此应该避免使用。
4. 指针的算术运算:指针可以进行加、减运算,表示指针指向的位置前进或后退多少个存储单位。
5. 指针与数组:数组名可以看作是一个指向数组首元素的指针,而可以通过指针加减运算来遍历整个数组。
6. 指针与函数:指针可以作为函数参数或返回值,用于在函数之间传递数据或引用。
函数指针用于存储函数的地址,可以通过函数指针来间接调用函数。
三、指针的常见问题:1. 空指针引用:当一个指针为空指针时,解引用该指针会导致程序崩溃或未定义行为。
因此,在解引用指针之前应始终进行空指针检查。
2. 野指针问题:使用未初始化或已经释放的指针会导致不可预测的结果。
应该在使用指针之前正确初始化,并及时释放不再使用的指针。
3. 内存泄漏:如果通过动态内存分配函数(如malloc或calloc)分配内存后没有及时释放,就会导致内存泄漏。
要正确管理内存,避免出现内存泄漏问题。
4. 指针类型不匹配:指针可以指向不同类型的变量,但要注意指针的类型与其指向的变量类型要匹配,否则可能会出现类型错误的问题。
5. 指针运算错误:对指针进行错误的运算,例如指针越界、指针不合法的算术运算,可能导致程序崩溃或未定义行为。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言指针教学中的知识点分析与总结C语言是一门重要的计算机基础课程,指针是C语言的精华。
而指针应用范围广、使用灵活等特点时常让初学者感到困惑。
用指针可以访问各种类型的数据,能够实现动态存储分配,提高编程效率,加深对数据存储方式的理解。
本文从指针的基本概念,指针在数组、函数、字符串、动态存储分配等方面的应用入手,剖析指针与各部分基础知识相结合时的教学重点和难点。
利用对比的方法指出初学者在学习指针过程中易混的概念及注意事项,有利于初学者对指针的理解和掌握。
1指针基本概念的理解指针学习首先应掌握其基本概念。
指针即地址、地址即指针。
程序运行过程中,变量、数组、函数等都存放在内存的存储单元中,每个存储单元都有地址。
使用变量、数组、函数既可以直接访问,又可以利用其存储单元地址进行间接访问,这种间接访问便是借助指针来完成的。
1.1对指针类型的理解理解指针概念要从指针类型入手,教师在教学中应着重讲述指针类型的含义,以及与普通变量类型的区别。
指针定义时的类型称为指针的基础类型,理解上应区别于普通变量的类型。
如定义:由上表可以看出,普通变量的数据类型决定了其占用内存单元的字节数以及存放数值的范围。
而指针变量不论其基础类型为何种类型,均占用4 个字节的存储空间。
并且指针变量与普通变量最大的区别在于,指针变量存地址值,而普通变量存数值。
1.2指针运算符的理解1.2.1对取地址符“ &”的理解指针变量定义后应为其赋一个有效地址值,让它指向有效的存储空间。
未赋值的指针变量称为“悬空”指针,使用悬空指针非常危险,可能会导致系统崩溃。
为指针变量赋值时常要用到取地址运算符“ &”。
令初学者常常感到困惑的是分不清赋值号左右两侧的数据类型是否匹配。
图1 所示为指针变量正确的赋值关系。
1.2.2对取内容符“ * ”的理解取内容符“ * ”又称间接运算符。
当指针指向某存储单元后,利用指针访问该存储单元的内容便要用到取内容符。
为帮助初学者更好的理解取内容符,在教学过程中应着重强调以下几个易混淆概念。
1)取内容符不是取指针变量自己的内容,而是取指针变量所指存储单元里的内容。
2)应区分取内容符和指针变量定义时的星号。
前者是一个运算符,后者仅仅是一个标志。
3)“取内容”运算与“取地址”运算互为反向运算。
取内容符“*”可以放在一级指针变量或者二级指针变量前面,但是不可以放在普通变量前面。
对于取内容运算有以下关系:* 二级指针一级地址* 一级指针数值1.2.3对指针加、减运算的理解对指针变量加减运算的学习应区别于普通变量的加减运算。
指针的加减运算是控制指针前移或后移,其移动的具体字节数由指针的基础类型决定。
如定义:char *p1;int *p2;double *p3;则p 1++、p2++、p3++均表示二个指针向后移动了一个单兀。
但由于p1、p2、p3的基础类型不同,决定了它们移动的字节数有所区别,p1 指针后移了1 个字节,p2 指针后移了4 个字节,p3 指针后移了8 个字节。
2指针与数组的关系及应用由于数组兀素在内存中连续存放,因此利用指针对数组操作是非常方便的,只需控制指针前移或者后移便可以指向不同的数组兀素。
2.1指针与一维数组指针与数组这部分学习的难点在于:1)如何表示数组中某个3)如何使用兀素的地址;2)如何将指针指向数组中的指定兀素;下标法”或“指针法”引用数组兀素。
引用一维数组兀素及其地址的方法有以下两种――“下标法”和“指针法” [1]。
如表2 、表3所示。
在教学中,应注意比较这两种方法。
如定义:int a[4]={1,2,3,4}, *p = a;则a 和p 中均存放了数组首地址。
因此对数组元素或者元素地址的引用便可以借助a 或者p 来完成。
1) “下标法”。
初学者可仔细比较以上两个表格中的内容,并加深对“下标法”和“指针法”的理解。
3) 注意区分以下几种表达式的含义。
利用指针操作数组,常常需要对指针作加减运算,以控制指针指向不同的数组元素。
表4 给出几种容易混淆的表达式。
初学者应注意比较每种表达式是对指针作自增运算,还是对指针所指向的内容作自增运算。
假设有定义:int a[5]={1,2,3,4,5};*p=a;表4 几种易混表达式的比较表达式第1 步运算第2 步运算等价表达式*(++p) 指针p 自增1,向后移动指向a[1] 取出p 当前所指a[1] 中的数值“ 2” *++p*(p++) 取出p 当前所指a[0] 中的数值1”指针p自增1,向后移动指向a[1] *p++++(*p) 取出p 当前所指a[0] 中的数值1”对取出的数值作自增运算得到“ 2” ++*p(*p)++ 取出p 当前所指a[0] 中的数值1”对取出的数值作自增运算得到“ 2”2.2指针与二维数组2.2.1二维数组中指针的类型C语言将二维数组名定义为一个行指针常量,行指针是指基础类型为一行元素的指针。
例如有定义:int (*P)[4]; ,表示定义了一个行指针变量P,该指针变量的基础类型为4个int型。
行指针相当于二级指针。
对二维数组元素的引用与一维数组类似,既可以使用“下标法”,也可以使用“指针法”。
如定义:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};则引用该数组第i 行第j 列元素的方法有以下几种:方法一:a[i][j] 方法二:*(a[i]+j)方法三:*(*(a+i)+j) 方法四:(*(a+i))[j]为了帮助初学者深刻理解并灵活使用以上各种方法引用二维数组元素,首先应建立起二级指针、一级指针、数组元素这三者之间的关系。
如定义:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};该数组中各元素在内存的存放形式,以及各行地址、元素地址如图3所示。
图3中的a+0、a+1、a+2代表各行元素的行地址,相当于级指针。
而a[0]+0 、a[0]+1 、a[0]+2 、a[0]+3 代表第1行中4个元素的地址,相当于一级指针。
由于二维数组名a 是一个行指针常量,相当于二级指针。
据公式:“二级指针+整数二级指针”,可知“ a+i”二级指针,代表二维数组中第i 行元素的地址。
根据“二级指针取内容降级为一级指针”的关系,可知“a[0] ”等价于“ *a”,相当于一级指针,代表二维数组中第行第1 个元素的地址。
根据公式:“一级指针+整数级指针”,可知“ a[0]+j ”是一级指针,代表该行中第j 列元素的地址。
理解了二级指针、一级指针的表示方法后,便可以利用“下标法”及“指针法”引用二维数组元素,如表 5 所示。
表5 二维数组元素引用的各种方法根据以上分析可知,二维数组每行元素的地址称为行指针,相当于一个二级指针。
因此可以定义一个行指针变量指向二维数组,然后借助该指针变量对二维数组元素进行引用。
例如,有定义:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int (*p)[4];定义了一个行指针变量P,其基础类型为4个int型数据,与行指针常量a同类型。
因此可以通过赋值语句“P = a; ”将二维数组第一行的行地址赋值给P。
图4表示行指针与二维数组的指向关系。
图4 所示,行指针变量P 指向二维数组的第一行,“ P+1”指向第二行,“ P+2”指向第三行,于是利用P 引用二维数组元素的方法见表 6。
维数组元素, 定义行指针变量时, 方括号内的常量值应与二维数 组的列长度相等。
2.2.3 指针数组与二维数组二维数组可以看作是由若干个一维数组构成的。
而每一个一 维数组可以由一个与之同类型的一级指针变量进行操作。
因此, 如果定义若干个一级指针变量并让它们分别指向二维数组的各行元素,则对二维数组元素的引用就可以借助这些一级指针变量 来完成。
这些一级指针变量组合在一起便构成了指针数组 例如有定义:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int *q[3];指针数组 q 中包含了三个 int 型的指针变量 q[0] 、 q[1] 、 可以通过以下语句将这三个指针变量分别指向二维数组各行的 第一个元素。
初学者应仔细比较行指针与指针数组的特点, 并体会利用它 们操作二维数组时的区别。
3 指针与字符串的关系及应用3.1 指针与单个字符串在教学中 , 应特别强调, 为保证行指针变量能够正确引用二[2] 。
定义了一个指针数组q ,由于二维数组a 有三行元素,因此q[2] ,字符串是连续存放在计算机内存中的若干个字符序列,因而使用指针操作字符串是非常方便的,并且不会造成内存空间的浪费。
初学者学习字符串这部分时,时常感到困惑的是分不清“字符数组”与“字符型指针”在字符串应用中的区别。
以下我们从几个角度帮助初学者理解两者的区别。
1) 从“变量定义并初始化”的角度区分。
char a[10] = "abc"; // 正确的数组定义和初始化char *P = "abc"; // 正确的指针定义和初始化以上是正确的定义语句,定义了一个字符数组a 和一个字符指针变量P,并对它们初始化字符串,二者的区别如表8 所示。
以上赋值语句a="abc"; 错误的原因是,赋值号左侧只能是变量名,而数组名a 是一个地址常量,常量是不能被赋值的。
语句P="abc"; 正确,因为P 是变量,该语句表示将字符串常量"abc" 在内存中的起始地址赋值给指针变量P。
3) 从“输入字符串”的角度区分。
char a[10], *P;gets(a); // 正确的用法gets(P); // 错误的用法gets( ) 函数的功能是从键盘读取一个字符串,并放到一个有效的存储空间里。
“gets(P); ”错误的原因是,指针P 此时是悬空”指针,还未指向任何有效的存储空间。
3.2指针与字符串数组单个字符串可以由一维字符数组或字符指针来操作,同理,字符串数组便可以由二维字符数组或指针数组来操作。
以下对这两种方法进行比较,以帮助初学者理解并掌握“二维数组构造字符串数组”和“指针数组构造字符串数组”的原理及区别。
假设有定义:char a[3][10] = {"China", "America", "Russia"};char *p[3] = {"China", "America", "Russia"};以上定义了二维数组a 构造字符串数组,系统为二维数组a开辟了30 个字节的连续存储空间,向其中存放了三个字符串。