当前位置: 首页 > article >正文

C++复习day01

这篇博客主要复习C语言的数组和指针

1.指针数组和数组指针

问:指针数组和数组指针,哪一个是指针,哪一个是数组?
我们来类比一下,整型数组是存放整型的数组,那么指针数组就是一个存放指针的数组,自然而然,数组指针就是一个指向数组的指针

#include <iostream>

int main()
{
	int a = 1, b = 2, c = 3;
	int* p1 = &a, * p2 = &b, * p3 = &c;
	int* arr[] = { p1,p2,p3 }; //指针数组
	int** ptr = arr; //数组指针
	return 0;
}
2.函数指针

这个有点特殊,所以单独拿出来做一下介绍
首先,函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。这个函数一定是有地址的

#include <iostream>
void solve()
{
	std::cout << "今天是复习C++的第一天" << std::endl;
}
int main()
{
	std::cout << solve << std::endl; //00C3137A
	std::cout << &solve << std::endl; //00C3137A
	return 0;
}

可以发现,对函数名取地址和原来的函数名效果相同——也就是说函数名就是地址,同样取函数的地址也可以使用“&函数名”的方法,二者是等效的
提出问题:那么什么叫做函数指针?
回答:顾名思义,就是一个指向函数的指针,请看“VCR”

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

下面来举一个例子

#include <iostream>

int add(int x, int y)
{
	return x + y;
}
int main()
{
	//以add()函数为例
	int (*p)(int, int) = add;
	std::cout << p(1, 2) << std::endl; //3
	std::cout << (*p)(1, 2) << std::endl; //3
	return 0;
}

下面来看,两个比较难的例子,尽量去分析一下

(*(void (*)())0)();

void (*signal(int , void(*)(int)))(int);
来分析一下,首先是第一个式子
(void (*)())很明显是一个函数指针类型,意思就是把**int**类型的0强制转化为一个函数指针类型,然后对它解引用,并且调用它

第二个例子
signal的第一个参数的int类型,第二个参数是”void(*)int的函数指针类型“,signnal的返回值也是“void(*)int的函数指针类型”,如果typedef void(*func)(int),之后就相当于func signal(int,func)
3.const和指针

const和*的位置不同,会有不一样的效果,他们被称作是指针常量,常量指针

#include <iostream>

int main()
{
	int a = 1, b = 2;
	const int* p1 = &a;
	int const* p2 = &a;
	int* const p3 = &a;
	p1 = &b;
	p2 = &b;
	//p3 = &b; 这个会报错,因为p3是指针常量,指针的指向不能修改,但是指针指向的值可以修改

	//*p1 = 100;
	//*p2 = 100; 这两个会报错,因为p1,p2都是常量指针,指针的指向可以改变,但是指针指向的值不能改变
	*p3 = 100;
	return 0;
}
4.sizeof,数组,指针

数组名的意义

  1. sizeof(数组名),这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩。
  2. &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表⽰⾸元素的地址。
#include <iostream>

int main()
{
	int arr[] = { 1,2,3,4,5 };
	int* ptr = arr;
	std::cout << "sizeof(arr) = " << sizeof(arr) << std::endl;
	std::cout << "sizeof(ptr) = " << sizeof(ptr) << std::endl;
	return 0;
}
5.sizeof和strlen的区别

sizeof:在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间⼤⼩的,单位是
字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据
strlen:strlen 是C语⾔库函数,功能是求字符串⻓度。
sizeof 和 strlen的对⽐

sizeofstrlen
sizeof是操作符strlen是库函数
sizeof计算操作数所占内存的⼤⼩,单位是字节srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数
不关注内存中存放什么数据关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界

http://www.kler.cn/news/289194.html

相关文章:

  • Java中的双亲委派模型以及如何破坏双亲委派
  • JetBrains`s IntelliJ IDEA springboot项目 gradle-bin安装 国内加速
  • upload-labs闯关攻略
  • 代码随想录刷题day21丨669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树,二叉树总结
  • Java-通过Runnable接口实现多线程
  • DNS介绍(hosts文件,域名结构),面试题(输入url后会发生什么)
  • HTTP Tomcat相关知识
  • Notepad++的高级功能及插件使用说明(含安装包)
  • NIO笔记03-文件编程
  • JS实现高度不等的列表虚拟滚动加载
  • mysql迁移到达梦数据库报错:列[xx]长度超出定义
  • subclass-balancing的related work+conclusion
  • 智能合约漏洞(五)
  • AI大模型编写多线程并发框架(六十五):发布和应用
  • vue 动态替换父组件
  • salesforce flow 更新记录,某一个更新失败会导致所有失败吗
  • SpringMVC基于注解的使用
  • 系统编程-数据库
  • [开源]低代码表单FormCreate的control表单联动功能的详解
  • vue3中使用supermap icilent3d for cesium
  • 【深度学习 CV方向】图像算法工程师 职业发展路线,以及学习路线
  • SSMA for MySQL 将MySQL数据导入SqlServer
  • Xilinx FFT IP使用
  • 【流式输出】LangChain流式输出的概念
  • Python教程:使用 Python 和 PyHive 连接 Hive 数据库
  • windows核心编程,纤程使用---->UNIX服务器应用程序移植到Windows中
  • 在更新python虚拟环境pip版本时,由于更新失败导致pip丢失的修复
  • GD - EmbeddedBuilder - 给已有工程换MCU
  • 【IPV6从入门到起飞】2-1 获取你的IPV6(手机、CPE等)
  • LVS Keepalived nginx haproxy 区别