指针进阶(从零到一)【纯干货】【C语言】

指针的进阶:1.字符指针;2.数组指针;3.指针数组;4.函数指针;5.函数指针数组;6.回调函数

首先来回忆一下我们在学习初阶指针时候了解到指针的概念:

1.指针就是变量,用来存放地址,地址唯一标识一块内存空间。

2.指针的大小是固定的4/8个字节(32位平台/64位平台)。

3.指针是有类型的,指针的类型决定了指针的+-正数的步长,指针解引用操作的时候的权限。

4.指针的运算。

一、字符指针

字符指针的定义

字符指针指向的是字符型数据的指针变量。字符串是由一系列字符组成的。字符指针可以指向字符串的首地址,然后通过移动指针的位置来遍历字符串、进行拼接、比较以及其他一系列操作。 

字符指针的定义和说明

char* str

这个语句定义了一个名为 str 的字符指针变量。变量类型为 char *,表示该变量是一个指向字符型数据的指针。我们可以通过 *str 来访问该指针所指向的内存单元中存储的值。 

#include
int main()
{
   char* ps="hello bit" ;//此处本质上是把“hello bit”这个字符串的首字符地址存储在了ps中
   char arr[]="hello bit" ;//arr数组中直接存放的是“hello bit”这个字符串
   return 0;
}

变量ps和数组名arr是一个意思,都是代表首元素的地址。但是字符指针和数组本质上是不同的。指针进阶(从零到一)【纯干货】【C语言】_第1张图片指针进阶(从零到一)【纯干货】【C语言】_第2张图片

最终结果为:str1和str2不同 ,str3和str4相同。指针进阶(从零到一)【纯干货】【C语言】_第3张图片

此处代码直接挂掉了。其实,字符指针后面的字符串是常量字符串,不可以修改,相当于在char前面加上了const,因此对于这样不可修改的常量字符串在内存中只会存储一份,所以str3和str4指向的字符串首元素的地址是同一个。

二、数组指针

数组指针就是指向数组的指针。 

数组指针的定义

数组指针是一种指向数组的指针变量。它可以指向数组的首地址,并通过移动指针的位置来访问数组中的各个元素。数组指针与普通指针的不同之处在于,它指向的是连续的内存空间,因此可以用来处理数组。

数组指针的定义和说明

type (*ptr)[size];

其中,type 表示数组中元素的数据类型,size表示数组的大小。

数组指针的应用

1.指向已有数组的指针 

int arr[5];
int (*ptr)[5] = &arr ;

在该例子中,我们首先定义了一个整型数组arr,然后使用&arr获取该数组的地址,并将其赋值给指针变量ptr。

2.访问数组元素

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 的元素

我们可以通过解引用数组指针和下标索引的方式找到想要的元素。 

3.数组指针作为函数参数

 指针进阶(从零到一)【纯干货】【C语言】_第4张图片

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_type1arg_type2 等是函数的参数类型pointer_name 是函数指针的名称。 实例如下:

#include
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 类型值的函数的指针。

后面还有回调函数的部分知识,明天会继续更新~~~~

你可能感兴趣的:(数据结构,算法,c语言,c++,开发语言)