扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
不要分,尽管讨论!在32位机里指针都是4字节。但为了书写标准化和移植,还是用sizeof(ptype)*n作为malloc的参数为好。其中n是需要分配多少个ptype型指针的个数。
创新互联公司专注于泰宁网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供泰宁营销型网站建设,泰宁网站制作、泰宁网页设计、泰宁网站官网定制、微信小程序定制开发服务,打造泰宁网络公司原创品牌,更为您提供泰宁网站排名全网营销落地服务。
这是泛型函数,或者叫通用函数,当你需要对一组数据排序时肯定需要给定确定的数据类型和排序逻辑后再进行排列顺序。
比如你要排序的数据是整数,那么排序函数的参数给定的必须是int类型的数组或数组指针。那么整数排序就要用整数变量(数组的元素是整数)比较大小,以便确定两个值的先后顺序(无论是正排还是倒排),也就是说比较大小时两个被比较的值的类型必须是确定的,正排还是倒排也必须指定的。
但是,有时候你又希望对字符串排序,而字符串比较大小不能直接用字符串地址比较,需要对两个字符串中的每个字符逐一比较,这样的话,首先,比较时处理方式不同,数据类型也不同,那你就不得不再编写一个函数用于字符串排序。
但是这样两个函数名称就必须不同,要么采用函数重载,这也是一种方法。但关键是,排序过程中除了两两比较的方法不同外(以确定两个数据先后),排序的逻辑是一致的,都是循环遍历所有数据,两两比较(无论是冒泡法还是折半法或者其他排序方法,他们的基本逻辑单元都是两两比较),返回两个数据的次序,然后写入排序缓存。
这样的话,你如果希望建立一套针对各种数据类型的排序函数库,就必须分别实现。每个函数都存在相同的排序逻辑是不明智的,因为会造成代码冗余,增加程序容量。
因此,合理的做法是将整体排序逻辑抽取出来,单独定义一个通用的排序函数,该函数接收虚指针,可以接收各种类型的数据指针,并根据比较结果写入缓存。而将两两比较的工作交给了程序员。程序员根据自己需要编写特定类型的比较逻辑的函数,并将函数传递给通用排序函数,由其调用。
这种处理方式或者说设计,相类似的有事件触发,windows编程中的回调函数,C#中的委托。提供了主要逻辑的时候又提供给程序员一定的自由度和灵活性。
你要习惯它,当然我理解,在无法驾驭前,或没习惯前,学习的时候希望更直接点,简单点,所以你可以先不使用qsort函数,自己尝试编写一个排序程序,不过系统提供的排序程序都经过优化的,排序效率肯定是很高的,而你自己编写排序程序肯定会遇到各种问题。不过在自己编写排序程序过程中你会明白为什么要将排序逻辑和比较逻辑分开,也自然会明白这么做的好处,更会理解为什么还要我自己写代码了。
这里还得说明的是,qsort函数中最后一个参数是函数指针,它的类型是
int (*compar) (const void *, const void *)
这个就是定义了一个接口,你必须实现如此定义的一个比较函数,并将你的比较函数的地址传递给qsort,qsort在排序时调用你定义的比较函数进行比较,以确定两数据的先后,而如何安排量数据的先后由你决定。而且你的比较函数必须返回-1或者1,-1代表第一个指针指向的值排前面,否则后面的指针指向的值排前面,而如果返回0代表两值相等,这种情况的排列还需主程序根据其他数据比较后进一步决定,这就无需你考虑了。
在C语言中好像没有泛型的说法,泛型是在C++中引入的,但是在C语言中有一个运算符叫做连接符,就是##,使用它可以实现类似于泛型的效果,因为代码较长,所以我在自己空间中做了一个双向链表的举例供你参考,连接如下:
另外,如果要深入学习##和#的使用,请参考:
如果要学习泛型相关知识,请参考:
一个函数的的声明,要给出 四个信息,举个例子
void printfMessage (void)
{
printf("Programming is fun.\n");
}
谁可以调用它 who call call it (注意 static 的应用)
返回值的类型 The type of value it returns
函数名 its name
参数列表 the arguments it takes
很显然 ,你说的例子中,get作为函数名
不同的是它们的返回类型,一个返回Int , 一个返回int.前者是一个指向int 类的指针,后者是整型
下面截至 k r
here is the function power and a main program to excuter it , so you can see the whole structure at once.
A function definition has this form: 函数定义具有如下格式
return-type function-name(parameter declarations, if any)
{
declarations
statements
}
返回类型 函数名(参数声明,...)
{
声明
语句
}
Returning Pointers
Although functions tht return pointers are handled just like any other type of function, it is review some key concepts and look at an example. Pointers are neither integers nor unsigned integers, They are the memory address of a certain type of data. One reason for this distinction is that pointer arithmetic is relative to the base type. For example, if an integer
pointer is incremented , it will contain a value that is four greater than its previous value
(assuming 4-byte integers), In general, each time a pointer is incremented(or decremented),
it points to the next(of previous) item of its type. Since the length of different data types may differ, the compiler must know what type of data the pointer is pointing to. For this reason that returns a pointer must declare explicitly what type of pointer it is returning. For example, you should not use a return type of int * to return a char * pointer! In a few case, a function will need to return a generic pointer. In this case, the function return type must be specified as void *.
To return a ponter, a function must be declared as having a pointer return type. For example, the following function returns a pointer to the first occurrence of the character c in string s; If no match is found, a pointer to the null terminator is returned.
/* Rerurn pointer of fisrt occurrence of c in s. */
char *match(char c, char *s)
{
while (c != *s, *s) s++;
return (s);
}
Here is a short program that uses match();
#include stdio.h
char *match(char c, char *s); /* prototype */
int main(void)
{
char s[80], *p, ch;
gets(s);
ch = getchar();
p = match(ch, s);
if (*p) /* there is a match */
printf(" %s ", p);
else
printf("No match found.");
return 0;
}
简单的翻译一下:
虽然函数返回一个指针和函数返回其他类型的值并没有什么区别,但是通过它回顾一些关键概念还是很有用处的。指针无非就是整型和无符号整型,它们是某些数据类型的内存地址,指针的运算涉及到它的基本类型,比如说,一个指向整型的指针增加1.这个指针变量的的值将会比他的前一个值大4, 一般来讲,指针每加1或者减1,它将指向下一项(这种类型)。由于不同数据类型有着不同的长度,编译器必须知道指针指向了哪种类型,为了解决这个问题,如果一个函数返回一个指针,它必须明确的给出它将返回哪种类型的指针。 比如说,你不能使用 int * 来返回char *. 在某些情况下,一个函数需要返回一个泛型(generic pointer), 在这种情况下,函数必须声明为 void *.
为了能够返回一个指针,函数必须明确的指出,它将返回哪种指针类型。举个例子,下列函数返回一个指针,指向字符串S中第一次出现的c,如果不能匹配上,返回一个指向NULL的指针
reference:
[1] Brian W. Kernighan Dennis M. Ritchie the c programming language
[2] Stephen G.Kochan Pogramming in C Third Edition
[3] Herbert Schildt C The Complete Reference Fourth Edition
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流