重拾指针(整理自一个知乎上非常不错的回答)

来源:互联网 发布:山东大学 李利平 知乎 编辑:程序博客网 时间:2024/06/07 23:05

大一上学期的时候学的C语言,在那时侯接触的指针相关知识。过去半年果然把指针忘干净了。。。。

今天利用剩余时间把指针相关知识复习一遍,把指针搞通!

1.指针中存在两种操作运算符
1).&操作符:取地址符

 2).*操作符:对指针进行解引用的操作

内存可以简化为一系列相连的无限长的单元,在单元中存放着数字,每个单元格为 1bite(1字节),计算机的工作就是对这些单元格里的数字进行处理。对每个单元格上的数字能够采取的操作只有写入和读取两种操作。因为每个单元格都有自己独有的编号,所以可以通过单元格的地址对单元格中的数字进行操作。
例如:

unsigned char a  = 1;//每个unsigned char 占一个字节。unsigned char* b = &a;//利用&取出变量a的地址,并将a的地址存在b的单元格中。printf("%d", *b);     //对指针b进行解引用操作得到a中存的值。

2.关于指针变量所占内存大小的理解

因为每个单元格只占一个字节,许多变量都需要多个字节来储存,比如int型就需要四个字节。故,不同指针类型所表示的变量所占字节数是不同的(占的单元格数也不同)。
由此引入指针类型的概念,对于int型的指针类型,是指从变量开头往下算四个单元格,而unsigned char型则只表示变量当前的格子。不同指针变量之间的转换需要强制类型转换。
例如:

unsigned int c   = 257;unsigned int *a  = &c;unsigned char *b = (unsigned char*)&c;

3)计算机使用二进制表示数字。

对所有unsigned的整形变量来说,二进制的值本身就代表了他自己的数值,257转换成二进制是:100000001,int型就是4个字节。因为8位数字占用一个字节,所以int型就是32位数,补齐0后得到:00000000 00000000 00000001 00000001.8个8位数字转换成10进制,上面的数字即为0011.机器在读取时看到是个int*型指针,故读取对应地址的四个字节所存的数字,反之机器在读取是看到是char*型指针,只会读取地址对应的第一个单元格。

4)关于指针的运算

假设有一个指针a,那么a+1所代表的就是加上a的类型所占字节数所得到的新地址。至于指向不同数据类型的指针下一步后所指向地址的大小的不同在于指针的步长,指针步长由编译器所决定。
减法也是一个意思,只不过对应的变量地址是从当前往前追溯对应数据类型所占的格子。
指针之间可以相加,但是相加得到的结果没有意义。

5)关于指针变量的大小

指针的大小由所存地址的宽度决定,和对应数据类型无关。


整理到现在差不多了,在整理的过程中突然很想学机器学习,或许这就是我的兴趣所在吧。。


原创粉丝点击