指针的进阶:1.字符指针;2.数组指针;3.指针数组;4.函数指针;5.函数指针数组;6.回调函数
首先来回忆一下我们在学习初阶指针时候了解到指针的概念:
1.指针就是变量,用来存放地址,地址唯一标识一块内存空间。
2.指针的大小是固定的4/8个字节(32位平台/64位平台)。
3.指针是有类型的,指针的类型决定了指针的+-正数的步长,指针解引用操作的时候的权限。
4.指针的运算。
一、字符指针
字符指针指向的是字符型数据的指针变量。字符串是由一系列字符组成的。字符指针可以指向字符串的首地址,然后通过移动指针的位置来遍历字符串、进行拼接、比较以及其他一系列操作。
char* str
这个语句定义了一个名为 str
的字符指针变量。变量类型为 char *
,表示该变量是一个指向字符型数据的指针。我们可以通过 *str
来访问该指针所指向的内存单元中存储的值。
#include<stdio.h>
int main()
{
char* ps="hello bit" ;//此处本质上是把“hello bit”这个字符串的首字符地址存储在了ps中
char arr[]="hello bit" ;//arr数组中直接存放的是“hello bit”这个字符串
return 0;
}
变量ps和数组名arr是一个意思,都是代表首元素的地址。但是字符指针和数组本质上是不同的。
最终结果为:str1和str2不同 ,str3和str4相同。
此处代码直接挂掉了。其实,字符指针后面的字符串是常量字符串,不可以修改,相当于在char前面加上了const,因此对于这样不可修改的常量字符串在内存中只会存储一份,所以str3和str4指向的字符串首元素的地址是同一个。
二、数组指针
数组指针就是指向数组的指针。
数组指针是一种指向数组的指针变量。它可以指向数组的首地址,并通过移动指针的位置来访问数组中的各个元素。数组指针与普通指针的不同之处在于,它指向的是连续的内存空间,因此可以用来处理数组。
type (*ptr)[size];
其中,type
表示数组中元素的数据类型,size表示数组的大小。
int arr[5];
int (*ptr)[5] = &arr ;
在该例子中,我们首先定义了一个整型数组arr,然后使用&arr获取该数组的地址,并将其赋值给指针变量ptr。
void printArray(int (*ptr)[5])
{
for (int i = 0; i < 5; i++)
{
printf("%d ", (*ptr)[i]);
}
}
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;
printArray(ptr);
return 0;
}
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;
int value = (*ptr)[2]; // 获取数组中索引为 2 的元素
我们可以通过解引用数组指针和下标索引的方式找到想要的元素。
int* arr1[10];//整形指针的数组
char* arr2[4];//一级字符指针的数组
char**arr3[5];二级字符指针的数组
三、指针数组
指针数组是一个数组,其中的每个元素都是指针类型。在 C 语言中,指针数组有着广泛的应用,可以用于存储字符串、多维数组、函数指针等。
type *array_name[size];
其中,type是指针数组中每个元素的类型,array_name
是指针数组的名称,size是数组的大小。
下面给一个实例:
int *ptrArray[5];
这个声明表示 ptrArray
是一个包含 5 个元素的指针数组,每个元素都是int类型的指针。
初始化:
int a = 1;
int b = 2;
int c = 3;
int *ptrArray[3] = {&a, &b, &c};
四、函数指针
函数指针是指向函数的指针变量。它可以用于存储函数的地址,并且可以通过函数指针来调用相应的函数。
return_type (*pointer_name)(arg_type1, arg_type2, ...);
其中,return_type
是函数的返回类型,arg_type1
、arg_type2
等是函数的参数类型pointer_name
是函数指针的名称。 实例如下:
#include<stdio.h>
int Add(int a, int b)
{
return a + b;
}
int main()
{
int arr[10] = { 0 };
int(*parr)[10] = &arr;//parr是指向数组的指针,存放的是数组的地址
int (*pf)(int, int) = &Add;//pf就是一个函数指针变量
return 0; //Add和&Add代表同一个意思,都可以取出Add的地址
}
五、函数指针数组
函数指针数组是一个数组,其中的每个元素都是指向函数的指针。
函数指针数组的初始化
return_type (*array_name[size])
其中,return_type
是函数指针所指向函数的返回值类型,array_name
是函数指针数组的名称,size
是数组的大小。实例如下:
int (*funcPtrArray[3])(int, int);
这个声明表示 funcPtrArray
是一个包含 3 个元素的函数指针数组,每个元素都是指向带有两个 int
类型参数且返回 int
类型值的函数的指针。
后面还有回调函数的部分知识,明天会继续更新~~~~