对c语言中的指针进行深入全面的解析

server/2024/9/24 12:56:45/

1.普通的指针:

实际上指针就是存放地址的变量,eg:

int a=10;

int *p=&a;

拆分一下int *中的*说明p是一个指针,int是它所指向的类型;


2.字符串指针和字符串数组

char*str1="abcd";

先看这一个,这个就是一个字符串指针,它是一个常量指针,在c中才能这么定义,如果是cpp中,

它会强制要求你用 const char* str1="abcd";

这个指针是让"abcd"这个字符串的地址赋予给了str1,而它们的地址是处于静态内存区的,你是无法进行修改的。

字符串数组,eg

char str[20]="abcd";

这个就是生成了一个空间用于存放这个字符串,这个空间中的内容是可以修改的,所以一般的str函数操作的字符串都是在操作这一个。


3.指针与数组相互联系:

int arr[10]={0};

int *p=arr; 

这里的arr指的是arr数组的首元素的地址 既为arr[0]的地址;

&arr则指的是整个数组,让我们验证一下这件事:

从16进制的转换可以得知,这里跳过了40个字节,也就是10个int,说明&arr确实指向的是arr这整一个数组;说到这里,让我们拓展一下,sizeof中出现arr时,代表的也是整一个数组,

             int sz = sizeof(arr) / sizeof(arr[0]);

所以我们总是会使用这种方式去求取整型数组中元素的个数;总结一下:

只有在sizeof(arr)和&arr时arr代表的是整个数组,否则都是数组首元素的地址;

这个在二维数组也是成立的,让我们来证明这件事。eg:

1:

跳过了20个字节,也就是5个int;

2:

int arr[3][5]={0};

int (*pf)[5]=arr;这里需要使用(数组指针才能够接受它的地址)


4.数组指针,指针数组等的讲解

char* arr[10]={0};

这个就是一个指针数组(也就是存放指针的数组),char* 代表了是一个char类型的指针,[10]说明了是一个数组;为什么不是数组指针呢?因为数组指针是长这样的 char (*arr)[10](一般是用于处理二维数组比较常用);上面那个是先跟数组组合的,说明是一个数组。

这里附上指针数组使用的例子,数组指针容易错误使用的例子和正确使用的例子。

1.指针数组的使用例子

打印的那个也可以换成arr[j][i]也没有关系,相当于模拟了一个二维数组的效果;

2.数组指针的错误使用

3.数组指针的正确使用例子


5.函数指针

5.1简单介绍

void add(int a,int b){

return a+b;

}

int (*pf)(int a, int b)=add;

这里相当于定义了一个函数指针,让add函数的首地址赋值给了pf,(*pf)()这个格式说明了是一个函数指针,但是有一点要注意的就是在调用的时候,可以不用解引用符号,pf(2,3)即可,为什么呢?因为你没发现函数在调用的时候也是add(2,3)吗,但是如果为了思维上更严谨,你当然也可以加

既 (*pf)(2,3)注意要用括号;

5.2函数指针在函数声明方面的引用

void (*(*pf)(int a,void (*)(int a)))(int a)

这个是个函数指针,怎么看呢?

A=(*pf)(int a,void (*)(int a))

首先把 void(*A)()

这样你是不是就看出来了呢

 怎么理解这件事情呢?请看下面

typedef void(*)(int a) pf_t 这样重命名是错误的,要用下面的方式

typedef void(*pf_t)(int a); 既把void(*)(int a) 简化为pf_t

pf_t pf(int a,pf_t)

与 int add(int a, int b)这样的函数声明是不是就能联系上了呢?


http://www.ppmy.cn/server/121355.html

相关文章

数模方法论-蒙特卡洛法

一、基本概念 蒙特卡洛法是一种基于随机抽样的数值计算方法,主要用于估计复杂系统的数值解。其基本原理是通过生成大量随机样本,来模拟系统的行为或求解特定的数学问题,比如积分、概率和优化等。 在应用上,蒙特卡洛法可以用于金融…

Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐

在日常文字编辑中,我们经常需要重复使用复制的内容。然而,新内容一旦复制,旧内容就会被覆盖。因此,选择一款易用高效的剪贴板工具成为了许多人的需求。本文整理了一些适用于 macOS 系统的优秀剪贴板增强工具,欢迎大家下…

【ShuQiHere】 探索数据挖掘的世界:从概念到应用

🌐 【ShuQiHere】 数据挖掘(Data Mining, DM) 是一种从大型数据集中提取有用信息的技术,无论是在商业分析、金融预测,还是医学研究中,数据挖掘都扮演着至关重要的角色。本文将带您深入了解数据挖掘的核心概…

可编辑PPT | 能源企业数字化框架、数字化运营及数字化平台建设方案

项目背景及需求理解 首先提出了全球能源互联网的概念,强调了清洁能源和电能替代的重要性,并介绍了德国工业4.0战略以及泛在电力物联网的创新。文档探讨了信息化与工业化的深度融合,以及云计算、大数据、物联网和移动应用等新技术在能源行业的…

Linux——创建编写并编译一个C程序

一、使用vim编辑器 在Linux系统下,使用vim编辑器创建、编写并编译一个C程序是一个常见的做法。以下是一个详细的步骤指南,我们将创建一个简单的C程序,该程序的功能是输出“Hello, World!”到终端。 步骤 1: 打开vim编辑器并创建C程序文件 …

OpenCVHaar级联器实现人脸捕捉和微笑检测

概念 Haar 级联分类器是由多个简单分类器组成的复杂分类器,每个简单分类器都由 Haar 特征训练得到。Haar 级联器因其简单和快速而被应用于某些场景。OpenCV 提供多种预训练的 Haar 特征级联分类器,其已经在大量图像上进行了训练,并且针对特定…

【灭鼠先锋 / B】

题目 代码 #include <bits/stdc.h> using namespace std; unordered_map<string, bool> m; bool check(string s) {return count(s.begin(), s.end(), O) 1; } bool SG(string s) {if (m.count(s))return m[s];if (check(s))return m[s] false;for (int i 0; i…

Vue 3有哪些新特性

Composition API&#xff1a; 这是 Vue 3 中最引人注目的新特性之一。Composition API 提供了一种全新的方式来组织和重用逻辑。它允许你将组件的逻辑按功能组织成可复用的代码块&#xff08;称为“组合式函数”&#xff09;&#xff0c;而不是像 Vue 2 那样按选项&#xff08;…