一、指针函数
指针函数是指返回指针的函数。这种函数的返回值是一个指针,可以是指向任何数据类型的指针。
指针函数的声明语法如下:
返回值类型* 函数名称(参数列表);
例如,一个返回 int 指针的函数可以这样声明:
int* array(int size);
注意:返回值为指针的函数,不能返回局部变量地址。
malloc函数
其功能为可以动态分配内存,函数原型如下:
void *malloc(unsigned long num_bytes);
malloc函数返回值
如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
malloc函数使用注意事项:
malloc函数的返回的是无类型指针,在使用时一定要强制转换为所需要的类型。
重点:在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。
二、函数指针
函数指针是一种特殊类型的指针,它指向一个函数而不是一份数据。换句话说,函数指针存储的是函数在内存中的地址。通过函数指针,可以在程序运行时动态地选择要调用的函数。
函数指针的声明语法如下:
返回值类型 (*指针名称)(参数列表);
例如声明一个指向接受两个 int 参数并返回 int 的函数的指针:
int (*func_ptr)(int, int);
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int main(void)
{
int (*p)(int , int );
p = sub;
printf("%d\n", p(10, 20));
return 0;
}
在这段代码中,定义了一个函数指针(*p)(int ,int),它可以指向add或者sub函数。
函数指针和指针函数的区别
- 函数指针是一个指针变量,用于存储函数的地址。函数指针的本质是变量。
- 指针函数是一个函数,它的返回值是一个指针。指针函数的本质是函数。
三、指针的数组
一个数组中的所有元素保存的都是指针
,那么就称为指针数组。其一般形式为
数据类型 *数组名[常量表达式][常量表达式]...... ;
它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每个元素都是一个指针。
例如:char *s[] = {"Hello","World"};
第一个指针指向了字符串"Hello",第二个指针指向了字符串"World",而sizeof(s)=16,因为在64位平台,指针类型大小占8个字节。
指针数组和字符串数组相结合使用,例如:
#include <stdio.h>
int main()
{
char *s[3] = {"Hello","World","China"};
printf("%s\n%s\n%s\n", s[0], s[1], s[2]);
return 0;
}
结果如下
Hello
World
China
需要注意的是,字符数组 str 中存放的是字符串的首地址,不是字符串本身,字符串本身位于其他的内存区域,和字符数组是分开的。
只有当指针数组中每个元素的类型都是char *
时,才能像上面那样给指针数组赋值,其他类型不行。