首页 > 代码库 > 指针数组、数组指针、指针函数、函数指针的简介

指针数组、数组指针、指针函数、函数指针的简介

一.指针数组:本质是一个数组,里面存放的元素是指针。比如:char *nums[10];定义了一个名称为num 长度为10的存放元素为:指向char类型数据的指针变量的数组。数组中的每一个元素都是一个指针,每一个指针都能够指向一个字符串。

 

在程序中举例:

int main(int argc, const char * argv[]) {

   // 指针数组就是用来表示字符串的数组

   char *strs[10];

   // 声明了一个数组, 同意存储 10 个字符串

   // 每个字符串

   strs[0] = "1234";

   strs[1] = "你好";

   // ...

   strs[9] = "hello iOS";

   return 0;

}

指针数组和二维数组的差别:

1.    二维数组赋值必须使用for循环或者strcpy()函数进行赋值,而指针数组能够直接赋值。

如。arr1[]=”qazwsx”;

2.    二维数组赋值之后能够更改。可是指针数组赋值之后不能更改。

数组指针:本质是一个指针。指向一个数组的指针变量(变量中存放的地址就数组的地址。

3.    数组的长度一旦定义后就确定,分配的内存也被确定不可改动。假设字符串分配到数组之后长度太小就会浪费空间,假设太大,字符串就盛不下,可是指针不会。

例如以下图:

技术分享

 

二.数组指针:本质是一个指针。指向一个规定长度的数组。

定义:如 int (*p)[10]; 

 int 指的是指针指向的数组的元素的类型。

(*p)指的是定义一个名称是p的指针变量名。[10]指的是指针指向的数组的长度。此时定义了一个指针变量 p, 该变量指向一个长度为 10 的元素为 int 类型的数组。

比如:

int main(int argc, const char * argv[])

{

    int(*p)[10]="1 2 3 4 5 6 7 8 9 0";

printf("%s",*p);

return 0;

}

 

拓展:int *(*p)[10]。指的是定义了一个指针型变量p,指向一个长度为10存放指针类型元素的数据。

 

 

 

 

 

 

 

 

三.指针函数:本质是一个函数。

返回值为指针。

Int *function(參数)

{

…………

}

对于这样的函数。一定要慎用。举个样例。给出一段同事之前出现错误的代码:

int *func() {

    intarr[] = {1,2,3,4};

return arr;

技术分享

 

}//这是非常危急的做法,在这里开辟的函数存在栈里面。函数结束后内存收回。非常easy出 bug。除非手动开辟内存,或者开发人员对当前内存分布情况比較深入。

 

 

四.函数指针:本质上是一个指针。指向函数的指针。也就是说该指针变量存放的是函数的地址。

核心意义:使用一个变量存储一个函数,然后利用变量调用函数

语法:

比如定义一个有两个參数,一个int返回值的函数:int strcmp(char *, char *)。

定义它的函数指针:int (*p)(char*, char *);仅仅须要将函数名称去掉换上(*p)就能够了。

指针数组、数组指针、指针函数、函数指针的简介