前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >指针进阶(从零到一)【纯干货】【C语言】

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

作者头像
see.
发布2024-06-04 12:50:45
1040
发布2024-06-04 12:50:45
举报
文章被收录于专栏:C++破军之路

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

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

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

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

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

4.指针的运算。

一、字符指针

字符指针的定义

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

字符指针的定义和说明

代码语言:javascript
复制
char* str

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

代码语言:javascript
复制
#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指向的字符串首元素的地址是同一个。

二、数组指针

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

数组指针的定义

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

数组指针的定义和说明

代码语言:javascript
复制
type (*ptr)[size];

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

数组指针的应用

1.指向已有数组的指针 
代码语言:javascript
复制
int arr[5];
int (*ptr)[5] = &arr ;

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

2.访问数组元素
代码语言:javascript
复制
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;
}
代码语言:javascript
复制
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;
int value = (*ptr)[2];  // 获取数组中索引为 2 的元素

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

3.数组指针作为函数参数
代码语言:javascript
复制
int* arr1[10];//整形指针的数组
char* arr2[4];//一级字符指针的数组
char**arr3[5];二级字符指针的数组

三、指针数组

指针数组的定义

指针数组是一个数组,其中的每个元素都是指针类型。在 C 语言中,指针数组有着广泛的应用,可以用于存储字符串、多维数组、函数指针等。

指针数组的声明

代码语言:javascript
复制
type *array_name[size];

其中,type是指针数组中每个元素的类型,array_name是指针数组的名称,size是数组的大小。

下面给一个实例:

代码语言:javascript
复制
int *ptrArray[5];

这个声明表示 ptrArray是一个包含 5 个元素的指针数组,每个元素都是int类型的指针。 

初始化:

代码语言:javascript
复制
int a = 1;
int b = 2;
int c = 3;
int *ptrArray[3] = {&a, &b, &c};

四、函数指针

函数指针的定义

函数指针是指向函数的指针变量。它可以用于存储函数的地址,并且可以通过函数指针来调用相应的函数。

函数指针的声明

代码语言:javascript
复制
return_type (*pointer_name)(arg_type1, arg_type2, ...);

其中,return_type 是函数的返回类型,arg_type1arg_type2 等是函数的参数类型pointer_name 是函数指针的名称。 实例如下:

代码语言:javascript
复制
#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的地址
}

五、函数指针数组

函数指针数组的定义

 函数指针数组是一个数组,其中的每个元素都是指向函数的指针。

函数指针数组的初始化

函数指针的说明

代码语言:javascript
复制
return_type (*array_name[size])

其中,return_type 是函数指针所指向函数的返回值类型,array_name 是函数指针数组的名称,size 是数组的大小。实例如下:

代码语言:javascript
复制
int (*funcPtrArray[3])(int, int);

这个声明表示 funcPtrArray 是一个包含 3 个元素的函数指针数组,每个元素都是指向带有两个 int 类型参数且返回 int 类型值的函数的指针。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字符指针的定义
  • 字符指针的定义和说明
  • 数组指针的定义
  • 数组指针的定义和说明
  • 数组指针的应用
    • 1.指向已有数组的指针 
      • 2.访问数组元素
        • 3.数组指针作为函数参数
        • 指针数组的定义
        • 指针数组的声明
        • 函数指针的定义
        • 函数指针的声明
        • 函数指针数组的定义
        • 函数指针的说明
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档