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

有关C语言指针学习思想的随笔常用形式的总结(原创)

2005-08-21 17:44 721 查看
对于成功的使用C程序设计语言而言,正确的理解并使用指针是十分重要的,我在学习数据结构的时,体会的更加深入,有必要对几种常见指针使用方法作一下小结。


什么是指针?指针可以看作是存放内存地址的变量,如果一个变量含有另一个变量的地址,则称第一个变量Point to 第二个变量,指针又两个操作符&和*,&是一元操作符,只作用于一个操作数,他返回操作数的地址,可以认为&的意义是“求地址”。*也是一元操作符,可以看作&的补操作。返回其操作数所指变量的值。int * p这是就基本的也是最一般的表示方法,解释成为,基类型+* +指针变量名,应该注意的是基类型应该与p所指向变量的类型是一致的,这里谈到了类型,一般类型的指针可以转化成另一种类型,这里需要注意的是void * 型的指针可以赋给其他任何类型的指针,void *型指针一般称为普通指针,它是常用来说明基类型未知的指针。void *类型允许函数指定参数,这个参数可以接受任何类型的指针变元而不必报告类型失配。它转换成其它类型的指针不需要明确的强制类型的转换。这里需要指出的是指针操作说指针类型而不是他所指向的对象类型的支配。举个例子 double x=100.1,y; int *p; p=(int *)&x; y=*p;
这里使用了强制的类型转换,这种转换是正确的,但是不用按预期的结果去执行,因为int是4个字节,duoble是8个字节因为p被声明为整形指针。所以只有4个字节的信息通过此赋值语句化为y。可以施加指针的算术操作只有+,-。他是以基类型为一个单位的。所以指针++以后是指向下一个整数,并且可能与前一个整数地址在内存地址上并不连续。p=p+12时表示p指向当前位置后的第12个元素。我们还可以从指针中减去另一个指针,除此之外都是违法的。指针还可以进行比较,如if(p>q).一般来判定是否指向一个对象。
指针和数组两者极为密切。char str[80],*p; p=str;这里p置成数组str的首元素。所以第5个元素是str[5]或*(p+4)一般来说后者比使用下标要快。
指针数组,如 int * x[10];它表明这个数组每个元素都是一个基类型为整形的指针变量。如果作为参数进行传递,可以写成void name(int * x[]){...} 指针数组常用来放置指向串的指针。如static char * err[]={"第一个字符串";“第二个字符串”}可以以表的形式呈现出来而指针数组的每个值都是每行的首地址;
多级间地址,也就是指向指针的指针,至于几级并没有限制,但一般很少见二级以上。普通指针是含预期值变量的地址,在指针对指针时,第一个指针含第二个指针的地址,第二个指针再指向含预期值的变量,int x,*p;**q; x=10;p=&x;q=&p;
结果 *p与**q的值是一样的都是10。
函数指针 int (*p)(const char *,const char *);他是作为函数的句柄指向函数的首地址,可以赋值p=strcmp。他也可以作为另一个函数的参数来传递,*p外的括号是必不可少的。
下面来看一下这个式子,p=(int (*)[10])malloc(40*sizeof(int));这可以分解成int (*p)[10]; p=malloc(40*sizeof(int));这两部分来说明,p是一个指向含10个整数数组的指针,但它的基类型是10-int数组,当p增量时,他指向后10个整数的开头。它通常用来表示一个以线性结构来存储的表的结构,并且这表的行是由malloc动态分布的,也就用指针实现了动态数组。


有新想法的匆匆过客可以留言补充。以上只是对一些常用的加以分类,Good Luck.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: