C语言:指针基础

您所在的位置:网站首页 手把手教你学c语言pdf C语言:指针基础

C语言:指针基础

2023-12-31 16:47| 来源: 网络整理| 查看: 265

指针基础 概论指针简介指针和地址指针变量指针变量的定义和初始化指针变量的定义:指针变量的大小:指针的表示和使用:指针变量的运算:指针变量的初始化: 指针使用的优势指针函数传参指针代替一维数组

概论

时隔一年,又一次复习起C语言,感慨良多,渐渐才明白为什么国内外一众大学都选择C语言这个看似已经不太常使用的古老编程语言作为第一学习语言了。

因为它太经典了,“凡是比C语言低级的,都不足以完成整个系统化程序编写,凡是高于C语言的,都来源于C语言”,对于初学者,基本的数据类型,编译器的接触,控制逻辑与控制流程语句,数组,指针,结构体等都是非常普世的编程思想和工具。

尤其是指针,去年首次学习,对于指针了解只是浮皮潦草地知道它可以节约计算开销,直接管理内存,有助于提高程序运行效率。这一年经历过C++和Java的学习后,才知道指针才是其他编程语言引用的系统的始祖,理解了指针才能更好理解什么是高效的代码,什么是真正的内存管理。

最后,也安利下机械工业出版社起策教育编写的**《手把手教你学C语言》**这本书,这本书算是我看到的国内又简洁易懂,而且内容还比较详实的C语言入门书,几乎可以吊打国内一众高效自编的教材,对于国内大学自编教材,很多时候我是真的无语,要不内容,举例陈旧,要不过于晦涩不易理解,或者因为满足课时安排,大量删减一些细节内容导致大家学习后理解不深入。而相对来说,一些市面上教育机构发行编写的教程反而更加实用好看了,针对入门读者确实是福音。

指针简介

要我说,指针这个特性就是C语言的精华,我们编写的变量,函数,都是要占用一定内存空间的,而为了计算时找到这些空间所在地读取到存放的对应数据,我们机会需要给所分配的空间一个地址。而指针就是记录这些地址的藏宝图。

指针和地址

打个比方来讲,一台计算机的是一家大宾馆的话,内存空间被规矩地划分为一个个房间,房间号就是一个个的变量名,函数名,而地址就是这些房间的具体位置,房间可以存放int,double等数据,而指针就是指引我们找到这些对应房间具体位置的地图。

指针变量

那么这些房间里不仅可以装数据,自然也是可以藏着另一张地图,就好像连环的寻宝游戏,一个线索连着下一个线索,而这些装着线索的房间就是指针变量。

指针变量的定义和初始化 指针变量的定义:

int *p; int作为基类型,表示此指针变量可以指向的数据类型,而int*才是真的真正的数据类型,指针变量型,p仅仅是指针变量的名字,也就是房间号而已。

指针变量的大小:

对于指针变量所占用的字节数一律是4个字节,和基类型占用字节数无关。因为32位计算机恰好是四个字节大小,可以正好满足所有内存地址的需要。

指针的表示和使用:

对于定义时候,我们加上*表示这个是指针变量,但是使用时候,只需要直接使用P即可。p的内容就是所指向变量的的地址。而如果想要得到指向内容中存放的数据,就是实际内容,可以用*p表示,此时*的意义是指获取内容。

我们对一般变量取得地址则使用&来表达,例如int a;int *p=&a;这样就把变量a的地址赋值给了指针变量p。而此时*p又完全等价于a。

指针变量的运算:

对于指针变量的运算只有减法,没有其他运算,而两指针相减的结果是一个常量,意义就是算出两个指针所指向元素的个数。

指针变量的初始化:

一般我们如此进行初始化float *k=NULL; 而如果不进行初始化就使用的话,很有可能指针指向一些不安全的地址,导致不可预知的后果。

使用指针最常见的错误就是指针未初始化和给指向空的指针写内容,谨记凡是变量最好要初始化。

指针使用的优势 指针函数传参

对于我们没学习指针以前,对于函数传参都是直接传递一个值,这叫值传递,也叫作拷贝传参,因为需要拷贝下参数的值当做参数传入,而对于穿入的参数做出的计算不仅不会影响外面的实际变量,而且还增加了程序运行的负担,而指针传递不仅提高运行效率,而且将会直接将函数内计算结果如实反应在外界变量上。

#include int main() { int a=10,b=20; void swap(int *m,int *n); swap(&a,&b); printf("%d,%d",a,b); return 0; } void swap(int *m,int *n){ int temp; temp=*m; *m=*n; *n=temp; return; }

上述代码将会直接改变a,b中的值,简单且高效。 之后的函数传参中,除了一些少数情况如数据量比较小,而且只作为计算显示量,不参与结果计算的话,那么还可以使用值传递,否则多数情况下还是指针传参的效率更好。

指针代替一维数组

对于数组,其本质就是一堆连续的内存空间,而例如a[100]的本质就是a[0]的首元素地址不断传递下去的一堆存储空间,也就对应着一堆连续的地址。因而指针完全可以代替数组来实现数组的功能。

指针的移动:不过在那以前,我们将将指针的移动规则讲清楚。两个指针变量虽然不可以进行普通的加法,但是一个指针变量却可以加上加减另一个常数,其结果就是指针指向地址的移动,而+1也不是指地址的移动一个,而是而是移动到下一个元素的地址,因为每个元素所占据的地址是四个,因而+1就是移动四个地址。

所以也就引出int *p;int a[10]; 其中*(p+i)等价于a[i]

#include int main() { int a[]={1,2,3,4,5}; int *p=NULL; for(p=a;p


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3