关于C语言的指针,相信有很多人都已经明白了它是什么意思,但是也有很多人处在迷茫之中,我们一起来看看吧
指针就是其值为内存地址的变量---------直观的理解,可以参考
变量是直接引用变量的值,而指针是间接(通过值的地址)来引用变量的值------只管理解,可以参考
指针可以被初始化为0,null,或一个地址值
也许通过实验能更加深理解:
intmain(){inta;int*p;
//现在我们初始化a
a=47;p=a;
printf("%d\n",p);}
vs2008:
------已启动生成:项目:CFile,配置:DebugWin32------正在编译...hello.ce:\code\net\c语言\hello.c(11):warningC4047:“=”:“int*”与“int”的间接级别不同正在链接...正在嵌入清单...生成日志保存在“file://e:\Code\NET\C语言\CFile\CFile\Debug\BuildLog.htm”CFile-0个错误,1个警告==========生成:成功1个,失败0个,最新0个,跳过0个==========
输出47
---------------------------------------------------------------------------------------------------------------
其实指针变量也是变量,你可以对它赋值,这没有什么好奇怪的!
#include
intc;
a=47;p=a;c=&a;
printf("%d\n",p);printf("%p\n",c);
}
------已启动生成:项目:CFile,配置:DebugWin32------正在编译...hello.ce:\code\net\c语言\hello.c(13):warningC4047:“=”:“int*”与“int”的间接级别不同e:\code\net\c语言\hello.c(14):warningC4047:“=”:“int”与“int*”的间接级别不同正在链接...正在嵌入清单...生成日志保存在“file://e:\Code\NET\C语言\CFile\CFile\Debug\BuildLog.htm”CFile-0个错误,2个警告==========生成:成功1个,失败0个,最新0个,跳过0个==========输出:
470012FF60请按任意键继续...
--------------------------------------------------------------------------------------------------------------------------------
其中%p是格式化输出标记,他说了:“用系统实现时所定义的方式(这个系统是以哪种方式来显示指针,这里很显然是十六进制的)显示一个指针的值”
呵呵,可我们显示的是c,仅仅是一个普通的int类型,它的值是一个地址!!他以16进制的方式显示了这个地址(a的地址)的值。
printf("%d\n",p);printf("%p\n",c);printf("%p\n",a);}
------已启动生成:项目:CFile,配置:DebugWin32------正在编译...hello.ce:\code\net\c语言\hello.c(13):warningC4047:“=”:“int*”与“int”的间接级别不同e:\code\net\c语言\hello.c(14):warningC4047:“=”:“int”与“int*”的间接级别不同正在链接...正在嵌入清单...生成日志保存在“file://e:\Code\NET\C语言\CFile\CFile\Debug\BuildLog.htm”CFile-0个错误,2个警告==========生成:成功1个,失败0个,最新0个,跳过0个==========
输出:
47
0012FF60
0000002F
呵呵,看清楚了吧,%p不是跟指针绑定的,他只是说:“以这个系统显示指针的方式来显示这个数!”,他有什么别的权利!
printf("%d\n",p);printf("%p\n",c);printf("%p\n",a);printf("%p\n",&c);}
0012FF48
很简单,最后一行输出的是c的地址的值(我们知道了p在这个系统中就是以十六进制来显示的,所以我们用p来格式化输出),c本身的值也是一个地址(是a的地址),但是你应该知道什么是什么!
到了这里你还没有看到指针到底有什么特别之处,你所看到的指针变量的功能和普通的变量似乎没有什么区别,正象第一行输出那样,他被赋予了一个整数值然后就被输出了!!
我们需要时刻记住,一个指针变量是用来存储地址的,但是整数值也可以表示地址,所以我们将一个整数值赋予一个指针变量也没有什么不妥的地方,这就同将一个地址的整数值赋予他是一样的。也许你有兴趣看一下地址为47的这个内存单元中存储的内容,我们试试吧!
a=0x000019b0;p=a;c=&a;
printf("%d\n",p);printf("%p\n",c);printf("%p\n",a);printf("%p\n",&c);printf("%d\n",*p);}
这里可以通过编译,但是却不能运行,这是为什么呢(而我们所做的改动仅仅是最后一行的输出语句,也就是说问题出在输出语句上)??能通过编译,说明了编译器并不认为我们的改动有什么错误!!!但是为什么不能运行呢??
、#include
a=47;p=0x0012FF60;c=&a;
正常编译,正常运行
1245024
我们将a的地址赋予p,这个时候我们再*p就可以正确得到了输出值47!!
上一个例子我们不能执行呢?我们不知道内存的47单元是否有可用的值!!!!有吗?我们不知道!!!但是我们想知道,到底怎么办!!!
a=47;p=0x0012FF60;*p=99;c=&a;
printf("%d\n",p);printf("%p\n",c);printf("%p\n",a);printf("%p\n",&c);printf("%d\n",*p);printf("%d\n",a);}
------已启动生成:项目:CFile,配置:DebugWin32------正在编译...hello.ce:\code\net\c语言\hello.c(13):warningC4047:“=”:“int*”与“int”的间接级别不同e:\code\net\c语言\hello.c(15):warningC4047:“=”:“int”与“int*”的间接级别不同正在链接...正在嵌入清单...生成日志保存在“file://e:\Code\NET\C语言\CFile\CFile\Debug\BuildLog.htm”CFile-0个错误,2个警告==========生成:成功1个,失败0个,最新0个,跳过0个==========
0000063
99
可见,我们通过指针改变了变量a的地址单元的值,哈哈,你也许认为我们能通过这样的方式来改变其他地址的值!!这样的想法对吗????
a=47;p=0x0012FF58;*p=99;c=&a;
printf("%x\n",p);printf("%p\n",c);printf("%p\n",a);printf("%p\n",&c);printf("%d\n",*p);printf("%d\n",a);}
正常编译可以运行:
12ff58
惊呼吧,似乎发现了新大陆,可是我们把0x0012FF58改成0x0012FF59你会看到不能运行,你会发现系统提示你a的地盘被入侵了!!!!呵呵!!!改成其他值似乎也不能解决不能运行的现象。
栈是个好东西,你不能破坏他的规矩,你要按照规矩来,你不能做超出规矩的动作!!
你必须遵循内存中栈的规则,否则你将破坏内存的分配机制,进而做出不安全的操作!!这是一中保护措施!!这里间隔2的地址是可以赋值的!!但是要记住一定得不侵犯别人的东西!!
所以呢,你如果要通过这样的方式来改变内存中的值,你必须对内存的状况透彻地了解,可是似乎我们没有这么大的能力吧!!
所以通过变量来实现这样的动作更理智和现实!!
所以呢,你可以看到指针的作用:你就是用她来保存一个变量的地址!!然后呢,你可以直接来得到那个变量的地址!!然后呢,你可以通过*P的形式,来访问或者修改这个变量的值!!而普通的变量,你就不能在之前面加上*来访问这个变量的值所代表的内存单元的值,这个是指针变量的专利产品!!
通过深入学习这些知识点,你将能够熟练地运用C语言指针进行高效的编程,解决复杂的算法问题,并构建自己的数据结构。提供的《C和指针》PDF文档将为你提供详细的解释和实例,加深对这些概念的理解。
-通过《C语言指针大全.doc》和《MethodPointer.png》中的实例,可以进一步理解和应用上述概念,解决实际编程问题。在学习和使用C语言指针时,务必重视实践,通过编写代码加深理解。同时,理解指针的底层工作原理...
在本项目"C语言指针式时钟设计"中,我们将探讨如何利用C语言的基本特性,尤其是指针,来实现一个动态的、实时更新的指针式时钟。这个时钟模拟了真实世界中的钟表,包括时针、分针和秒针的运动,通过在控制台或图形...
以下是关于C语言指针的详细知识点。首先,要理解指针的概念,我们得先了解变量在内存中的存储实质。计算机的内存是一个用来存储数据的线性空间,它由一系列的字节组成,每个字节都有一个唯一的地址标识,这个地址...
使用场景及目标:①掌握C语言指针的基础概念和使用方法;②学习指针的各种高级应用技巧;③了解指针在实际开发中的重要性和常见问题。阅读建议:本文内容较为全面,建议仔细阅读每一部分,结合实际编程练习加深...
3.**解引用操作**:`*`运算符用于访问指针所指向的值,如`inty=*p;`会将`p`指向的值赋给`y`。4.**函数参数传递**:C语言中,函数参数传递可以使用指针,实现按址传递,修改函数内部的局部变量,或者直接操作...
在"C语言指针资料集"中,可能包含了这些知识点的详细讲解,包括实例代码、练习题和解答,帮助读者逐步提升对C语言指针的理解和应用能力。无论是初学者还是有一定经验的程序员,都能从中受益,加深对这一核心概念的...
【C语言指针教学】C语言中的指针是其核心特性之一,也是让许多初学者感到困惑的概念。指针能够直接存储内存地址,允许我们直接访问和修改内存中的数据,从而实现高效的数据操作和复杂的程序设计。理解并熟练掌握...
本压缩包"指针学习.rar"包含了C语言指针学习的入门基础代码和相应的网页说明,旨在帮助初学者理解和掌握这一关键概念。1.**指针的基本概念**-指针是一个变量,其存储的是另一个变量的内存地址。-指针类型与...
###C语言指针详解####一、变量与内存在深入了解指针之前,首先要明确变量与内存的关系。变量是程序设计中最基本的数据存储单元之一,它在内存中占有一定的空间。例如:-`inti;`在内存中申请了用于存储...
###C语言指针详解####一、引言C语言是一种广泛使用的程序设计语言,以其高效性、灵活性和强大的底层控制能力而著称。在C语言中,指针是一个非常重要的概念,它允许程序员直接操作内存地址,从而实现对内存的...
3.**解引用操作**:使用`*`符号可以访问指针所指向的内存单元的值,如`printf("%d",*p);`会打印出`x`的值。4.**指针运算**:指针可以进行加减运算,但这些运算不是简单的数值相加减,而是移动到内存的下一个或...
中级篇则在基础上进一步深入,介绍指针这一C语言的核心概念,如何利用指针进行动态内存管理、数据结构操作,以及更复杂的函数用法,如递归和回调。此外,还将涵盖文件操作、预处理器、位运算等高级主题,帮助读者...
###C语言指针的详细用法在C语言中,指针是一种非常强大的特性,它允许程序员直接控制和操作内存地址。本文将详细介绍C语言中指针的各种用法及其应用场景,帮助读者更好地理解和掌握指针。####指针基础在开始...
本文将深入探讨C语言指针的教学方法,旨在帮助学习者更好地理解和掌握这一概念。首先,理解指针的本质至关重要。指针是一个变量,它存储的是另一个变量的内存地址。在内存模型中,每个变量都有一个唯一的地址,这...
本文将深入探讨C语言指针的教学问题,旨在为教师和自学者提供有效的学习策略。首先,理解指针的基本概念至关重要。指针是一个变量,它存储的是另一个变量的内存地址。在C语言中,我们可以通过取地址运算符`&`获取...