首页 > 代码库 > 学习笔记:指针之C
学习笔记:指针之C
指针的确是C的特点之一,从最初接这玩意就没把它弄的很明白。据说把它真正吃透的人也不多。这也只是我的学习笔记。指针,记得当初C语言老师说的一点,就是地址,其他就没啥印象了。自从自己做题就是记住了这点,指针就是地址,访问相应内存空间的值是间接访问,要用‘ * ’,也叫解引用指针。
通过C和指针这本参考书,我才知道我们是用变量来代替地址,也就是我们口中的变量。硬件依旧通过地址访问内存位置。相应内存空间存储的值得类型也并非值本身所固有的一种特性,而是取决于他的使用方式,这是隐式的决定方式。
在使用指针前,必须将其初始化,这是通过& 操作符完成的。不然就应该将其初始化为空指针即NULL。这样做的好处是防止指针未初始化会造成的未知错误。
另外需要注意一点,变量的值就是分配给该变量的内存位置所存储的数值,即使指针变量也不例外。例如
int a;//假设a 的地址为100 int *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 的值。
学习笔记:指针之C