【C语言】高级指针和字符串特性

来源:互联网 发布:mui 仿照 淘宝 模板 编辑:程序博客网 时间:2024/05/17 07:01

指针是C语言的一把双刃剑,我们应该使用好这门绝技,决不能误伤了自己;


(1)注意函数调用中,指针的指针的使用,比如链表插入的例子中,分析下面代码片段:

int i;int *pi;int **ppi;ppi = &pi*ppi = &i;
其实我们可以得出pi已经指向了整型变量i;其实在函数调用含有指针传递时中,函数所拥有的只是指向一个需要修改的内存位置的指针,如:

char *s = "123";fun(s);----------------------------void fun(char *s){ s[0] = '2'  //effective char *p = "456"; s = p;  //not effective}
我们可以修改s[0]的值,我们指向了这个内存位置的指针,而我们却无法改变s的指针,正确用法如下:

char *s = "123";fun(&s);----------------------------void fun(char **s){ **s = '2'  //effective char *p = "456"; *s = p; //effective}

(2)在int *f[]中,f是一个数组,他的元素类型是指向整型的指针,在int *(*f[])()中,声明创建了一个指针数组,指针所指向的类型是返回值为整型指针的函数;


(3)回调函数是指用户把一个函数指针作为指针为参数传递给其他函数,后者将“回调”用户的函数;比如在比较各种类型的函数(字符串,整型等),还有在转移表中,我们常用函数指针的;


(4)字符串常量,“xyz”+1是合法的,它取到了第二个字母,即字符y;而*"xyz"表示它取到了所指向字符x;在"0123456789ABCDEF"[x]其实是取到某一个字符,也是很重要的;还有“*************”+10-n把它当做指针取到对应的值然后来输出;


(5)在strlen(x)-strlen(y) >= 0永远为真,因为strlen(s)是无符号整数,相减仍然是正整数,正确的用法是strlen(x)>=strlen(y)来进行比较,这样才能成功;


(6)strncpy()拷贝长度为len的字符来填充,它不会以NUL字节结尾;而strncat总是在结果字符串后面添加一个NUL字节;


(7)字符串查找中,strspn(char *s, char *s1)用于在字符串s的起始位置对字符(s1中)计数,直到s1中没有任何字符在s中可以找到位置,即找到第一个在s中找到与s1不相匹配的第一个字符位置;strcspn(char *s, char *s1)执行相反的操作,它对s字符串起始部分中不与s1中的任何字符进行统计,即找到第一个在s中找到与s1相匹配的第一个字符位置;


(8)其实在考虑多维数组时,指向想明白多维数组的低几维的元素仍然是里一个数组,比如int matrix[3][10],其中matrix是一个指向10个整数型元素的数组的指针;*(martix+1)是指向第二行的第一个元素,*(*(martix+1)+3)
是间接来取值了;


(9)字符二维数组(列维长度相同,没有就补0)第一个图,指针数组(存储的指针,本身也是要占内存的)第二个图,所以内存的耗费大小要整体来看;



(10)如下的函数原型是不同的,对于fun1和fun2一样,编译器必须知道第二维的长度,第一维不需要,在计算每一个下标并不需要第一维的长度,第一个下标根据第二维的长度来调整,第二个下标也是根据第二维的长度来调整;fun3中是一个指向整型指针的指针,与指向整型数组的指针不是一回事,很重要的区别,当然可传入长度参数来判别边界;

void fun1(int (*mat)[10]);void fun2(int mat[][10]);void fun3(int **mat);

                                             
0 0
原创粉丝点击