您的位置:首页 > 编程语言 > C语言/C++

【内功篇】指针&数组&字符串(一)

2017-07-17 15:18 267 查看
这篇我来说说指针这玩意,C为啥可以面向计算机底层编程,就是因为它能够操作内存,指针没学会,C语言就算是白学了。首先来个问题,内存是啥呢?

内存:

摘用百度百科上的一段话:

内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。

当然,这只是了解下内存的概念。我们只需要知道内存是存放代码运行时所用的数据(变量……)的地方,CPU通过内存读取数据进行运算,CPU咋读内存呢?当然是通过地址总线寻址啦。(PS:很多人在给电脑扩充内存的时候一定要注意自己的操作系统和CPU,32位的CPU总线带宽也是32位的,那他最多能寻2^32字节也就是4GB,如果你装了8G的内存条就白白浪费了一半空间,不过我们用的CPU应该都是64为了,所以主要注意别用32位操作系统了。同理64位的总线可以寻到2^64字节地址,非常大……)。内存的最小单位是字节,每个字节都有自己的地址,这个地址并不是客观存在的,而是通过总线的寻址方式表现出来的。关于内存就讲这么多,那么,内存这么操作呢?

指针:

C语言通过指针来操作内存。

先来看一段简单的代码:

int a  = 10;
int *p = &a;
printf ("p  = %p\n",p);
printf ("&a = %p\n",&a);
printf ("a  = %d\n",a);
printf ("*p = %d\n",*p);


这段代码中出现了两个字符“*”和“&”,啥东西?

“*”:我的理解是,在定义的时候,它表示这个变量为指针变量,指针变量只能存放地址;在非定义的时候,它指向地址内所存的数据。

“&”:取地址符,顾名思义,它的功能就是获取内存给该变量分配空间的地址。

我们看下上段代码的运行结果:



是不是和你想的一样。但是,我们知道int型变量占4个字节,指针变量不可能把4个字节的地址全部存下来,咋整,还好,系统给一个变量分配的内存空间是连续的,所以指针变量只存变量所占字节的首地址,注意:
int *p
中的int可不是指针的类型,而是所存地址中的数据的类型,这样在用
*p
的时候才能知道应该从首地址开始往后读多少位才能读出一个完整而正确的数据。

int不是指针变量的类型,那它的类型是啥呢?其实它就是一个地址类型,32位系统就给它分配4字节空间,64位系统看心情分配空间(因为我测试了好多遍,有时候是4字节,有时候是8字节);



通过这幅图来说下流程,最初,系统给变量a分配了一个内存空间,首地址为0x00000001,里面存放了一个整型数据10,程序运行下一句代码,这时系统给指针变量p分配一个内存空间,空间位4个字节,然后将变量a的地址存放到p内,图内忘记说明了,这时候的p本身也是有地址的,大家不妨用
printf ("%p",&p);
输出试一下。

在这要说明一下,很多人习惯的就定义了一个
int *p;
,这不是一个好习惯,这时候的p因为没有得到指定的地址去指,所以它会随便的在内存中指向一个地址,这种指针我们一般叫它野指针。所以在定义指针却又不想初始化,我们要写成
int *p =NULL;
严格意义上,这其实也算是初始化,因为NULL在内存中也是有一块特定的地址的,不过该地址无法读写(在windows下可能会读出00000000)。

这篇就讲一下指针基础的部分,如果有错的地方请在评论区里指出哦。

未完待续……………………

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言