指针随笔

来源:互联网 发布:等花开杂货铺 淘宝 编辑:程序博客网 时间:2024/05/08 17:16

指针是c的最有意思的地方,同时也是最难理解的

1)理解“指针就是地址”这句话,正确的理解是指针也是一种变量,需要内存空间,当你声明的时候,也就创建了一个指针大小sizof(int *)的空间,那么这个空间内容可以放一个地址,也就是0xa00c9s这样的玩意。

2)指针既然是变量,那么就可以进行操作,那么我们就要开始理解指针的类型,如果我们定义了一个指针变量p,假设变量p的地址是0x001,那么p+1就会变为多少取决于指针的类型,如果类型的大小是2个字节的,那么p+1的地址会成为0x003.

3)开始理解数组和"[" "]" 操作符,

我们先看看"[" "]"操作符,定义一个指针变量p,你可以用p[2]表示*(p+2),这里仅仅是用不同的语法表示了同样的意思

回来瞅瞅数组int a[4],则表示直接分配了一段连续的内存,内存按顺序可以存储4个int, a[0], a[1],a[2], a[3]

那么,数组名a是什麽,潜规则多多让你晕菜

如果打印a+1你会发现他是整个数组的下边界的地址,即a数组的首地址加上整个数组的长度

在表达式int *p = a中,a变为了&a[0],即第一个元素的地址

如果a作为函数的参数,a又会退化为指向int *类型的指针,其实也就是&a[0]

要记住,a和p一个是数组名,一个是指针,前者不可进行++操作,同样a是不能够作为左值赋值的

4)为了让世界更复杂,我们迎来了多维数组和双星**

int a[2][3]同样具有退化功能,作为参数或者右值会变为指向(int *)[3]类型指针

而**理解起来就更麻烦,如果我们定义了int **p,那么p首先占用几个内存单元,里面内容放着一个地址0xbbb,那么地址0xbbb这个内存单元存的啥玩意了?还是一个地址比如0xccc,那么地址0xccc放着什么,是一个int类型的数据


瞎扯了这么多,也不知道说清楚了没有,呵呵


0 0
原创粉丝点击