史上最牛逼的C++指针教学
- 格式:pdf
- 大小:168.95 KB
- 文档页数:22
c语言指针教学案例教学目标:通过案例学习,掌握C语言指针的基本概念和用法。
教学重点:1. 了解指针的概念和作用;2. 掌握指针的声明和初始化;3. 学会通过指针访问变量的值;4. 掌握指针作为函数参数的使用。
教学准备:1. 一台已安装C语言编译器的计算机;2. 编辑器,用于编写C语言代码;3. 投影仪,用于展示代码。
教学步骤:1. 引入指针的概念:指针是C语言的一个重要概念,它是用来存储变量地址的变量。
通过指针,可以间接访问和修改变量的值。
本节课我们将通过案例学习来深入理解指针的用法。
2. 案例1:使用指针交换两个变量的值:```c#include <stdio.h>void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}int main() {int x = 10, y = 20;printf("交换前:x = %d, y = %d\n", x, y);swap(&x, &y);printf("交换后:x = %d, y = %d\n", x, y);return 0;}```这段代码定义了一个交换函数`swap`,它接受两个指针作为参数,通过指针交换两个变量的值。
在`main`函数中,我们用这个函数来交换变量`x`和`y`的值,并输出结果。
3. 案例2:使用指针实现函数与主函数的数据传递:```c#include <stdio.h>void modify(int *num) {*num = 100;}int main() {int x = 10;printf("修改前:x = %d\n", x);modify(&x);printf("修改后:x = %d\n", x);return 0;}```这段代码定义了一个修改函数`modify`,它接受一个指针作为参数,通过指针修改变量的值。
KM教学法在C语言指针教学中的应用摘要:本文针对大学生在C语言程序设计课程学习指针过程中存在的主要问题进行了总结和分析。
针对KM教学法在C语言指针教学中的应用进行了探讨,事实证明这种教学方法取得了较好的效果,存在一定的推广价值。
关键词:C语言KM教学法指针教学方法是教师为完成教学任务所采用的手段,对教学目的的实现具有重要意义。
在确定了教学目的,有了相应的教学内容之后,为了取得预期的教学效果,就必须采用适当的教学方法。
教学方法要与学生的认识规律相适应,要与训练指导思想和教学原则相适应。
因此,教育工作者在教学方法上作了大量的改革和创新,如问题教学法[1]、任务驱动法[2]、专题式教学、引导发现教学法、互动教学法、问答式教学法以及KM教学法[3][4]等。
其中,KM 教学法符合教学赖以存在和发展的认知机理,能够系统而有重点地组织教学内容,符合学习思维的逻辑认知过程,它贯穿于教学的主要环节,具有实用性和通用性。
1 C语言指针C语言因为其功能强大、使用灵活、可移植性好,几乎成为了高校大学生必修的一门课程,在大学生计算机知识体系中有着重要的基础性作用。
指针是C语言中非常重要的一种数据类型,也是C语言的一个重要特色,灵活掌握指针的用法是C语言使用能力的一个标志。
正确而灵活地运用它可以有效地表示复杂的数据结构,能动态地分配内存。
能直接处理内存地址等,可以使程序简洁、紧凑、高效。
这对软件设计十分必要。
但是指针概念比较复杂。
应用也比较灵活且容易出错,学习者较难掌握,是C语言教学的难点。
特别对于初学者来说,指针通常比较难理解。
而由指针错误引起的调试问题连富有经验的程序员都感到头痛。
然而,指针是大多数C 语言程序的重要组成部分,在C语言的高级编程中基本都涉及到指针的应用,而且在以后的许多C++程序中仍然受到重用。
2 KM教学法KM是指在“知识逻辑结构”(Knowledge Logic Structure)的总体架构下融入“思维导图”(Mind Mapping)进行微观演绎[4]。
如何在C#中使⽤指针⼀:背景1. 讲故事⾼级语⾔玩多了,可能很多⼈对指针或者汇编都淡忘了,本篇就和⼤家聊⼀聊指针,虽然C#中是不提倡使⽤的,但你能说指针在C#中不重要吗?你要知道FCL内库中⼤量的使⽤指针,如String,Encoding,FileStream等等数不胜数,如例代码:private unsafe static bool EqualsHelper(string strA, string strB){fixed (char* ptr = &strA.m_firstChar){fixed (char* ptr3 = &strB.m_firstChar){char* ptr2 = ptr;char* ptr4 = ptr3;while (num >= 12) {...}while (num > 0 && *(int*)ptr2 == *(int*)ptr4) {...}}}}public unsafe Mutex(bool initiallyOwned, string name, out bool createdNew, MutexSecurity mutexSecurity){byte* ptr = stackalloc byte[(int)checked(unchecked((ulong)(uint)securityDescriptorBinaryForm.Length))]}private unsafe int ReadFileNative(SafeFileHandle handle, byte[] bytes, out int hr){fixed (byte* ptr = bytes){num = ((!_isAsync) ? Win32Native.ReadFile(handle, ptr + offset, count, out numBytesRead, IntPtr.Zero) : Win32Native.ReadFile(handle, ptr + offset, count, IntPtr.Zero, overlapped)); }}对,你觉得的美好世界,其实都是别⼈帮你负重前⾏,退⼀步说,指针的理解和不理解,对你研究底层源码影响是不能忽视的,指针相对⽐较抽象,考的是你的空间想象能⼒,可能现存的不少程序员还是不太明⽩,因为你缺乏所见即所得的⼯具,希望这⼀篇能帮你少⾛些弯路。
c语言指针详细讲解
C 语言中指针是非常强大的概念,它允许程序直接访问内存中的数据。
指针在 C 语言中最初是被用于解决内存分配问题而提出的,随着 C 语言的发展,指针也变得愈发重要。
指针的本质是一个存储变量地址的变量。
在 C 语言中,指针通常用符号&来表示,例如&x 表示的是 x 变量的地址。
指针变量存储的是一个内存地址,当程序读取指针变量时,它会读取该地址中存储的数据。
C 语言中可以使用指针进行高效的内存操作。
例如,当程序需要对一个数组元素进行修改时,可以直接用指针修改该元素的值,而不必修改数组名本身。
另外,指针还可以用于动态分配内存,这是 C 语言中一个重要的特性。
指针的使用方法比较灵活,但也需要小心使用。
如果不小心处理指针,可能会导致未知的错误。
例如,当指针指向的内存空间被释放后,程序试图访问该内存空间时可能会导致未定义的行为。
因此,在C 语言中,指针的使用需要更加谨慎。
C 语言中指针是一个非常重要和强大的概念,掌握指针的使用方法可以让程序员写出更加高效和安全的代码。
C语言指针部分教学心得作者:杨英翔来源:《卷宗》2013年第11期摘要:C语言是国内外广泛使用的一种计算机语言,C语言功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
关键词:C语言;教学0 引言C语言是国内外广泛使用的一种计算机语言,C语言功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
因此,C语言不仅是计算机专业学生的一门重要课程,也是高校中非计算机专业学生学习计算机知识的一门重要课程。
作者的C语言课都是在机房里进行的,学生可以人手一机。
在C语言的教学过程中,精讲多练,讲练结合,依据学生的能力,采用以学生为主体逐步引导、启发学生。
即教师在课堂上起引导的作用,让学生在机学习,边学边练,不断发现问题,解决问题,循序渐进,逐步提高。
这种方法打破了课堂教学和实验教学的严格界线,在C语言的教学实践中取得了良好的效果。
1 指针用法指针通常指向一片存储空间,而空间可采用静态分配或动态分配。
静态分配是指在编写C 程序时已确定了存储空间。
如使用全局变量,static char a[size],则编译器为变量a在程序运行时的数据区内固定分配size字节的空间;如函数内定义一个局部变量charb[size],则在执行函数时,局部变量b在栈上分配size字节的存储空间,函数调用结束时将自动释放局部数组变量b的存储空间。
动态分配是指调用库函数malloc(size)在堆上分配size个字节的连续空间,调用结束后返回一个指向分配好的存储空间的指针,编程时必须考虑到在使用完该存储空间后调用对应的函数free()来释放掉。
在C编程时,一定要合理使用指针,否则很容易在执行时出现各种错误。
以下列出常见的几个错误:(1)在C程序中定义了一个指针变量,但没有对其进行初始化,将该指针变量称为“野指针”。
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的时候,就表示它指向一个地址。
要了解指针,多多少少会出现一些比较复杂的类型,其实要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,其原则:从变量名处起,根据运算符优先级结合,一步一步分析。
皻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、细说指针指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。
先声明几个指针放着做例子:例一:(1)int*ptr;(2)char*ptr;(3)int**ptr;(4)int(*ptr)[3];(5)int*(*ptr)[4];1.指针的类型从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
这是指针本身所具有的类型。
让我们看看例一中各个指针的类型:(1)int*ptr;///指针的类型是int*(2)char*ptr;///指针的类型是char*(3)int**ptr;///指针的类型是int**(4)int(*ptr)[3];///指针的类型是int(*)[3](5)int*(*ptr)[4];///指针的类型是int*(*)[4]2.指针所指向的类型当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。
例如:(1)int*ptr;///指针所指向的类型是int(2)char*ptr;///指针所指向的的类型是char(3)int**ptr;///指针所指向的的类型是int*(4)int(*ptr)[3];///指针所指向的的类型是int()[3](5)int*(*ptr)[4];///指针所指向的的类型是int*()[4]在指针的算术运算中,指针所指向的类型有很大的作用。
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。
当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。
我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。
3.指针的值----或者叫指针所指向的内存区或地址指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。
在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。
以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
指针所指向的内存区和指针所指向的类型是两个完全不同的概念。
在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。
以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?(重点注意)4指针本身所占据的内存区指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。
在32位平台里,指针本身占据了4个字节的长度。
指针本身占据的内存这个概念在判断一个指针表达式(后面会解释)是否是左值时很有用。
2、指针的算术运算指针可以加上或减去一个整数。
指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,以单元为单位。
例如:例二:char a[20];int*ptr=(int*)a;///强制类型转换并不会改变a的类型ptr++;在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整型变量a。
接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4,因为在32位程序中,int占4个字节。
由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。
由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。
我们可以用一个指针和一个循环来遍历一个数组,看例子:例三:int array[20]={0};int*ptr=array;for(i=0;i<20;i++){(*ptr)++;ptr++;}这个例子将整型数组中各个单元的值加1。
由于每次循环都将指针ptr 加1个单元,所以每次循环都能访问数组的下一个单元。
再看例子:例四:char a[20]="You_are_a_girl";int*ptr=(int*)a;ptr+=5;在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。
由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。
在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。
虽然这种情况在应用上会出问题,但在语法上却是可以的。
这也体现出了指针的灵活性。
如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。
下面请允许我再举一个例子:(一个误区)例五:#include<stdio.h>int main(){char a[20]="You_are_a_girl";char*p=a;char**ptr=&p;///printf("p=%d\n",p);///printf("ptr=%d\n",ptr);///printf("*ptr=%d\n",*ptr);printf("**ptr=%c\n",**ptr);ptr++;///printf("ptr=%d\n",ptr);///printf("*ptr=%d\n",*ptr);printf("**ptr=%c\n",**ptr);}误区一、输出答案为Y和o误解:ptr是一个char的二级指针,当执行ptr++;时,会使指针加一个sizeof(char),所以输出如上结果,这个可能只是少部分人的结果.误区二、输出答案为Y和a误解:ptr指向的是一个char*类型,当执行ptr++;时,会使指针加一个sizeof(char*)(有可能会有人认为这个值为1,那就会得到误区一的答案,这个值应该是4,参考前面内容),即&p+4;那进行一次取值运算不就指向数组中的第五个元素了吗?那输出的结果不就是数组中第五个元素了吗?答案是否定的.正解:ptr的类型是char**,指向的类型是一个char*类型,该指向的地址就是p的地址(&p),当执行ptr++;时,会使指针加一个sizeof(char*),即&p+4;那*(&p+4)指向哪呢,这个你去问上帝吧,或者他会告诉你在哪?所以最后的输出会是一个随机的值,或许是一个非法操作.总结一下:一个指针ptrold加(减)一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。
ptrnew的值将比ptrold的值增加(减少)了n乘sizeof(ptrold所指向的类型)个字节。
就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高(低)地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。