学习笔记:指针之C

来源:互联网 发布:淘宝店铺的友情链接 编辑:程序博客网 时间:2024/04/30 06:39

因为某些原因来好好的将C重新梳理一遍,过去一年也是个渣,好在还能重新来过。将C和指针中指针一节学习了三四次,再将后面的习题做了一做。现在再好好回顾一下。至于对错就不过多评价。

指针的确是C的特点之一,从最初接这玩意就没把它弄的很明白。据说把它真正吃透的人也不多。这也只是我的学习笔记。指针,记得当初C语言老师说的一点,就是地址,其他就没啥印象了。自从自己做题就是记住了这点,指针就是地址,访问相应内存空间的值是间接访问,要用‘ * ’,也叫解引用指针。

通过C和指针这本参考书,我才知道我们是用变量来代替地址,也就是我们口中的变量。硬件依旧通过地址访问内存位置。相应内存空间存储的值得类型也并非值本身所固有的一种特性,而是取决于他的使用方式,这是隐式的决定方式。

在使用指针前,必须将其初始化,这是通过& 操作符完成的。不然就应该将其初始化为空指针即NULL。这样做的好处是防止指针未初始化会造成的未知错误。

另外需要注意一点,变量的值就是分配给该变量的内存位置所存储的数值,即使指针变量也不例外。例如

int a;//假设a 的地址为100int *b;a =120;b =&a;printf( "%d %d";a,b);
这样得到的值是120和100。这时我们也应该牢记指针变量的值就是一个数字,除非有间接访问操作符,否则我们是不能访问相应内存空间的值。

在解引用指针前,我们必须要确定相应的指针不是NULL指针,因为它是不能进行间接访问的。否则将会引发错误终止程序或者访问内存位置零,引发未知错误。

(检查参数的合法性)

指针常量其实蛮少用,除了极其特殊的情况(你能确定数据的内存位置)。此处应注意,假如知道指针变量确切位置即一整型数值,通过其间接访问操作话,应强制类型转化。如

*(int*)100 =5;
就是把值5存储于内存位置100。

指针的指针话,就应该先把一重指针搞明白后,多看看书,做做练习,对概念才更加深刻。

在学习时,遇到一些很常用的指针表达式。例如

char cp = 'a';char *cp =&ch;
&ch;cp;//右值 左值&cp;*cp;//<span style="font-family: Arial, Helvetica, sans-serif;">右值 左值</span>*cp + 1;*( cp +1 );//右值 左值++cp;cp++;*++cp;//右值 左值*cp++;//右值 左值++*cp;(*cp)++;//++*++cp;//++*cp++;
以上未标注的就只有为右值时合法。

不过正如书的作者所说 这并非让大家死记硬背,关键是让大家去理解这些表达式的意义。

坦白说我自己还是比较迷糊 不太理解这些表达式 不过忘了多翻翻参考手册 积累久了就好了。

另外对于指针的运算,指针和一个整数量执行算术运算时,指针的值根据合适的大小进行调整。即指针变化量等于整数量乘以数据类型所占字节大小(char 1 , short 2,  int 4,  double 8)。

只有指向同一个数组的指针才能进行减法运算。而其减法运算的结果与数据类型是没有什么关系的。减法运算的值是两个指针在内存的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。例如p1指向array[i]而p2指向array[j],那么p1-p2的值就是 j - i 的值。

0 0