浅学指针(3)

简介: 浅学指针(3)

前言

系列文章目录

前言

学习字符指针变量,数组指针变量,函数指针变量,函数指针数组,三个变量要有所理解,还有、函数指针数是重点内容。


1. 字符指针变量

为了加强理解。来我们来看如下代码:


int main()
{
  const char* pstr = "hello bit.";//这⾥是把⼀个字符串放到pstr指针变量⾥了吗?
  printf("%s\n", pstr);
  return 0;
}


其实并不是这样的,他是像字符串一样,把首字符的地址放到指针pstr里面了,为了让你们理解,如图:

3a92fd63f16942cda2d3795aecfd1fda.png

扩展⼀道和字符串相关的笔试题


#include <stdio.h>
int main()
{
  char str1[] = "hello bit.";
  char str2[] = "hello bit.";
  const char *str3 = "hello bit.";
  const char *str4 = "hello bit.";
  if(str1 ==str2)
    printf("str1 and str2 are same\n");
  else
    printf("str1 and str2 are not same\n");
  if(str3 ==str4)
    printf("str3 and str4 are same\n");
  else
    printf("str3 and str4 are not same\n");
 return 0;
}



运行结果:

b7b3c928745341ce9e773990d9a49e2b.png

这是为什么呢?其实,这⾥str3和str4指向的是⼀个同⼀个常量字符串,C/C++会把常量字符串存储到单独的⼀个内存区域,当⼏个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。


2. 数组指针变量

数组指针数组指针,强调的是指针,怎么理解呢?

(1)整形指针变量: int * pint; 存放的是整形变量的地址,能够指向整形数据的指针。

(2)浮点型指针变量: float * pf; 存放浮点型变量的地址,能够指向浮点型数据的指针。


那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。

那么我们来理解两句代码:


int *p1[10];
  int (*p2)[10];


思考一下p1,p2分别是什么?

正确答案是:p1是数组指针,p2是指针数组


怎么理解,这⾥要注意:[]的优先级要⾼于*号的,但是()优先级高于[ ],所以可以利用优先级理解,就如上面代码:

p1:[ ]的优先级高于 星号的,先和[ ]结合,说明p1是数组,数组10个元素,每个元素的类型是int *,所以p1是指针数组。

p2:( )的优先级高于[ ],*p2则说明p2是指针,在和[ ]结合说明是数组,所以p2是数组指针。


2.2 数组指针变量怎么初始化

数组指针变量是⽤来存放数组地址的,那怎么获得数组的地址呢?就是我们之前学习的 &数组名,这是整个数组放入。


操作如下:


int(*p)[10] = &arr;


调试下:

31e31f12fd604cf381021bc8981ced2b.png

看到 &arr 和 p 的类型是完全⼀致的。


总结:函数名就是地址,&函数名和直接使用函数名是一样的。

数组指针类型解析:


int  (*p)  [10] = &arr;
   |    | |
   |    | |
   |    |    p指向数组元素个数
   |    p是数组指针变量名
   p指向的数组的元素类型


3 .函数指针变量

函数指针变量是⽤来存放函数地址的,未来通过地址能够调⽤函数的。

函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名 的⽅式获得函数的地址,如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针⾮常类似。如下:


//第1种
void test()
{
  printf("hehe\n");
}
void (*pf1)() = &test;
void (*pf2)()= test;
//第2种
int Add(int x, int y)
{
  return x+y;
}
int(*pf3)(int, int) = Add;
int(*pf3)(int x, int y) = &Add;//x和y写上或者省略都是可以的


函数指针类型解析:


int  (*p) (int x, int y)
   |    | |
   |    | |
   |    |    pf3指向函数的参数类型和个数的交代,
   |    函数指针变量名
   pf3指向函数的返回类型
  int (*) (int x, int y) //pf3函数指针变量的类型


3.1 函数指针变量的使⽤

通过函数指针调⽤指针指向的函数


#include <stdio.h>
int Add(int x, int y)
{
  return x+y;
}
int main()
{
  int(*pf3)(int, int) = Add;
  printf("%d\n", (*pf3)(2, 3));
  printf("%d\n", pf3(3, 5));//*在这里可有可无因为函数名也是函数地址
 return 0;
}


输出结果:

5

8


4 .typedef关键字

ypedef 是⽤来类型重命名的,可以将复杂的类型,简单化。


⽐如,你觉得 unsigned int 写起来不⽅便,如果能写成 uint 就⽅便多了,那么我们可以使⽤:


typedef unsigned int uint;
  //将unsigned int 重命名为uint


果是指针类型,能否重命名呢?其实也是可以的,⽐如,将 int* 重命名为 ptr_t ,这样写:


typedef int* ptr_t;
  //将int * 重命名为 ptr_t


数组指针和函数指针稍微有点区别:

数组指针类型 int(*)[5] ,需要重命名为 parr_t ,那可以这样写:


typedef int(*parr_t)[5]; //新的类型名必须在*的右边


函数指针类型的重命名也是和数组指针类型⼀样的,⽐如,将 void(*)(int) 类型重命名为 pf_t ,就可以这样写:


typedef void(*pfun_t)(int);//新的类型名必须在*的右边


练习:


代码1:(*(void (*)())0)();
代码2:void (*signal(int , void(*)(int)))(int);


那么要简化代码,可以这样写:


xtypedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);


5. 函数指针数组

数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组,如:


int *arr[10];
  //数组的每个元素是int*


那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?


int (*parr1[3])();


可以向之前利用优先级理解,第1()里面是指针数组,把parr1

[3]删除后是int (* )()是函数指针,如图:


38936194810b46b385689b7ba04d02c4.png

相关文章
|
Python 存储 Unix
python-包及日志模块使用
一、包 1.包就是一个保护有__init__.py文件的文件夹,包的本质就是一种模块,即包是用来导入使用的,包内部包含的文件也都是用来被导入使用的.包是为了更好组织好模块,就是一个文件夹. 注:在python2中,包下必须有一个__init__.
1126 0
[LeetCode] Candy
Well, you may need to run some examples to have the intuition for the answer since we only require children with higher rating get more candies than their neighbors, not all those with lower ratings.
827 0
|
6天前
|
人工智能 运维 安全
|
4天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
519 14
|
11天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
888 109
|
5天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。