重新认识C语言指针(上)

? 独创性并不是首次观察某种新事物,而是把旧的、很早就是已知的,或者是人人都视而不见的事物当新事物观察,这才证明是有真正的独创头脑 —尼采

<p align="center">本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。</p>
<h3 align="center"><a href="https://github.com/midou-tech/articles" target="_blank">https://github.com/midou-tech/articles</a></h3&gt;
<h4 style="color:red;text-align:center">点关注,不迷路!!! </h4>

序言

 指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎。辨别一个人C语言学的好赖就看他对指针的理解怎么样。指针内容也是工作面试经常问到的问题。本文将带你重新认识那个绊倒你的指针,以解大家的心头之惑(恨)。

为什么要学习指针?

 有同学就要说了,既然指针这么难,这么不通俗易懂,为什么要学习他呢?其他高级语言都是把这块基本屏蔽掉了,不在让程序员直接操作指针,这里不直接操作指的是不让程序员用指针进行运算和强转而不是彻底没有了。举个java的例子

Object obj= new Object();
Object sec= obj;
sec = new Object();

 如果你去仔细研究他们的行为,就会发现 obj, sec 都只是一个指向对象的东西,可以为空,也可以修改指向,所以它们其实都是指针,只是 Java 的教材里面不在去提这东西而已,具体原因看我后面讲解便知道了。

? 继续说为什么学习指针,为什么学习指针就必须要说到指针的优点了。

  • 指针可以直接操作变量地址,所以很灵活。
  • 指针操作会减少很多变量的拷贝使得程序性能提升。
  • 可以动态分配内存。

 这些优点使得很多后台性能要求很高的系统、游戏内核、一些高并发的中间件都是使用C&C++语言开发出来的。比如强大的linux系统、nginx,mysql、redis等等。

 曾经看到一个搞笑的评论,hhh

道生一,一生二,二生三,三生万物

电脑生汇编,汇编生C , C生C++,C/C++生万物

指针是什么?

 其实指针看起来复杂,听起来复杂,学起来复杂,但是总结下来指针到底是个啥,也就一句话。

<p ><h4 style="color:red;text-align:center">指针就是地址,指针变量就是一个存放内存地址的变量</h4></p>

<img src="https://i01piccdn.sogoucdn.com/db3bc129d2c88816"></img&gt;

 你没看看错,是的就是这么简单明了。通常我们说的指针就约等于说的是指针变量。

指针和内存地址的关系

 很多人不明白指针其实也就是不明白内存地址,所以要想明白指针必须先明白指针和内存之间的关系。在讲内存和指针之间的关系之前先说下什么是内存。

 先明白一个问题,什么是内存?编程人员常说的内存指的是什么?

? 内存是电脑的一个硬件组成部分。从单片机的组成我们可以看到,CPU、内存和输入输出接口,就组成一个完整的电脑,其他统统属于外设。内存是可以被CPU通过总线进行操作的,也就是与CPU之间有总线相连接的。电脑所有的输入输出,都是要从内存来实现的。内存包括只读内存ROM和读写内存RAM,但在个人电脑(PC)中,我们通常所说的内存,是指读写内存。

? 程序人员常说的内存其实是虚拟内存,程序直接操作的是虚拟内存而不是真正的物理内存。

纳尼 程序都是操作的虚拟内存? 那虚拟内存是个啥东西?

 这里先给大家画张C语言程序的内存布局图。关于进程和内存管理会在后面的文章讲出来,记得微信搜索 龙跃十二 点关注。

 这个图很好的描述了内存地址的布局,指针变量里面存放的地址也就是这个内存地址。顺便说下啥是内存地址,用十六进制表示出来的一串数字编号(就好比你家的门牌号),只是这个数字是给内存标号的。32位系统下这个编号是4byte(32个bit)表示的,64位系统下是8byte(64bit)表示的。(这个小问题面试会被问到的)

如何使用指针?

指针的声明

int *p;
char *p1;
float *p2;

 声明还是很简单,指针的类型 * 变量名即可声明一个指针变量。

int num = 5;
int *p = &num;

 此时就是一个int类型的指针变量指向一个int变量,画个图解释下。

 以很清楚的看到指针p存放着变量num的地址,我们通常说指针p指向变量num,当p知道变量num之后,p就可以对变量num为非作歹了,比如

int main(){
    int num = 5;
    int *p = &num;
    printf("*p=%d,num=%d\n",*p,num);  //此时num的值就变为5
    p+=1;
    printf("*p=%d\n",*p);    //此时p指向了哪里?这句代码会不会报错?
} 

指针的大小和类型

 从上面的声明实例可以看到我定义了三种类型的指针,可以看出指针是有类型的。这里有同学就有疑问了,不是存放内存地址的么,内存地址不就是一串十六进制表示的数字么(其实底层都是二进制),哪来的什么类型一说呢,为什么又需要类型呢?

 这个疑问很好,我当时学习的时候也是很疑惑。首先我们明白了指针是一个存放地址的变量,明白这点还不够还必须理解另外一个问题就是

字节(Byte)是用于计量存储容量的一种单位,每一个字节由8位组成(1Byte = 8bit)。地址可以理解为在一片内存中,每个字节(Byte)的编号。

 所以很多人肯定会明白了,指针存放的是一个变量的首个字节的地址,那么问题来了。

int a = 5;
int *p = &a;

 我们声明指针p指向变量a的地址,也就是说指针p里面存放着变量a的首地址,在32位平台下,int a 是4字节,指针去取a的值的时候找到的是a的首地址,那怎么拿到变量a,聪明的同学已经恍然大悟,是的,没错,所以我们的指针需要类型的,编译器去取指针指向的内容时候会根据指针的类型去取。画个图如下

 此刻我相信你对指针已经有了很高的理解了。指针的大小很好理解 就是存放地址的范围,地址的范围是操作系统地址线的根数决定,所以指针的大小是随操作系统的寻址范围决定的,一般32位系统地址总线也是32根,寻址范围是2^32次方

 顺便说下32位操作系统和64位操作系统的区别在哪里,系统的位数代表运算能力,所谓32位就是能计算的字长是32位的,64位系统能计算的字长是64位。处理器的字长越大,说明它的运算能力越强。

<h5 align="center">点赞

原文地址:https://blog.51cto.com/13449864/2466197

时间: 2024-10-10 13:31:39

重新认识C语言指针(上)的相关文章

C语言指针讲解

指针是C语言的一种数据类型,类似于C中的其他类型,例如int ,char 等.既然指针是一种类型,当我们定义该类型变量,该类型变量就称为指针变量. C中有了指针就有了指向.指向:指针变量指向本身保存的内容(地址或指针)所表示的内存单元. C语言指针是一个特殊的变量,其里面储存的数值被解释成为内存里的一个地址. 在计算机中,所有对数据的操作,都是通过其地址进行的,指针让程序的效率更高,代码更少. 在学习指针的时间,一定要理解并区分指针的四个感念:指针的类型,指针所指向的类型,指针的值,指针本身所占

[转]C 语言指针的使用

第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让 我们分别说明. 先声明几个指针放着做例子: 例一: (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文?lt;<如何

C语言指针的陷阱

C语言指针的陷阱   分类: C/Cpp 转自:http://blog.csdn.net/porscheyin/article/details/3461670 "C语言诡异离奇,陷阱重重,却获得了巨大成功!"--C语言之父Dennis M.Ritchie.Ritchie大师的这句话体现了C语言的灵活性以及广泛的使用,但也揭示了C是一种在应用时要时刻注意自己行为的语言.C的设计哲学还是那句话:使用C的程序员应该知道自己在干什么.有时用C写的程序会出一些莫名其妙的错误,看似根源难寻,但仔细

C语言指针占用字节

指针即为地址,存的是变量的地址,在同一架构下地址长度都是相同的(cpu的最大寻址内存空间),所以不同类型的指针长度都一样. 指针占用几个字节跟语言无关,而是跟系统的寻址能力有关,16为地址指针即为2个字节,32位系统是4个字节,64位系统为8个字节. 用sizeof求长度: #include<stdio.h> void main(void) { printf("%d %d %d\n",sizeof(int),sizeof(double),sizeof(char)); } 在

c语言指针学习

前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水,食品,你能告诉还有没有问题的吗?不知大难至,世人依旧忙.祸福相依,危中有机.那些高级生命,出于慈悲,会救渡我们,但是你要去思考,去发现机缘. 最近较闲,没事就学点基础知识,整天在上层晃,感觉晕的厉害,接地气.关于指针我上学的时候学过一点,我的老师说"指针很难呢",当时以为这老师挺谦虚的.后

C语言指针解说

指针是C语言的一种数据类型.类似于C中的其它类型,比如int ,char 等.既然指针是一种类型,当我们定义该类型变量.该类型变量就称为指针变量. C中有了指针就有了指向. 指向:指针变量指向本身保存的内容(地址或指针)所表示的内存单元. C语言指针是一个特殊的变量.其里面储存的数值被解释成为内存里的一个地址. 在计算机中,全部对数据的操作,都是通过其地址进行的.指针让程序的效率更高,代码更少. 在学习指针的时间,一定要理解并区分指针的四个感念:指针的类型,指针所指向的类型,指针的值,指针本身所

彻底搞定C语言指针详解

1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: 内存地址→ 6 7 8 9 10 11 12 13 ----------------------------------------------------------------- ... | | | | | | | |.. ------------------------------- ---------------------------

C语言指针减法问题

今天同学问了我一个指针减法的问题,原来没细想过,记录下相关体会,感谢这位同学 源代码如下: 1 #include<stdio.h> 2 3 int main() 4 { 5 6 int a[]={0,1}; 7 int *p,*q; 8 9 10 p=&a[0]; 11 q=&a[1]; 12 13 printf("%x %x\n\n",p,q); 14 15 printf("%x\n\n",q-p); 16 17 return 0; 1

你需要知道关于C语言指针的一切

Everything you need to know about pointers in C 你需要知道关于C语言指针的一切 指针的定义 指针是内存地址. (嗯,简短的段落.) 开始 假设你声明一个名为foo的变量. int foo; 这个变量占用一些内存. 在当前主流的Intel处理器上,它占用四个字节的内存(因为int是四个字节宽). 现在让我们声明另一个变量. int *foo_ptr = &foo; foo_ptr被声明为指向int的指针.我们已经初始化它指向foo. 正如我所说,fo