Cpp Experiment -- sizeof and array

本文探讨了C++中数组与指针在使用sizeof运算符时的区别,通过具体示例代码展示了直接定义数组与通过指针访问动态分配数组在内存占用上的不同表现,以及如何在函数参数中正确传递数组。

    这是很多公司面试的时候会问的问题——当然,在你加入某家公司后,你可能会发现这些东西一点也用不上。因为进去后一般是天天写业务逻辑。

    不过最近写一个功能时涉及到这个东西,就做了个测试,把结果记下来,下面是代码:

#include <iostream>

using namespace std;

void getSize(char *a) 
{
    cout << sizeof(a) << endl;
}

void fakeFunc(char a[20])
{
    cout << sizeof(a) << endl;
}

// 形参是数组引用
void getArraySize(char (&a)[10])
{
    cout << sizeof(a) << endl;
}

int main()
{
    char a[10];
    char *b = new char[10];
    
    cout << sizeof(a) << endl;
    cout << sizeof(b) << endl;

    getSize(a);
    getSize(b);

    fakeFunc(a);
    fakeFunc(b);

    getArraySize(a);
    //getArraySize(b);  无法通过编译

    return 0;
}

    首先是直接定义一个char数组和定义一个char *指针指向一个new出来的数组。这两者之间的区别在于:前者,虽然我们编译器总是比它转成指针, 但它还是一个数组,而第二个东西,它就是一个彻头彻尾的指针,无论如何都变不成一个数组,这点我们可以从测试结果中看到。

    这里依次测试了直接sizeof它们,以不同的形参数接收它们,并输出接收后它们的size。下面是结果:

    前两个是直接sizeof的大小,可以看到直接传一个数组进去,还是很诚实地输出了10,第二个结果是8,原因就是上面讲的原因,b是一个指针,而不是一个数组,而在64位系统中指针占8个字节。

    这里面有一个函数——fakeFunc,为什么叫这个名字,因为这个函数的形参写得很像是要定义一个数组,但实际上,编译器把它转换了,它的形参其实与getSize函数的形参一模一样。所以测出来的结果也都是8(指针的大小),因此接下来是4个连着的8。

    最后,getArraySize函数,它的形参是一个数组的引用,此时必须传入一个同等size的数组,可以看到,我在main函数中只调用了一次getArraySize,传入的是a,而没有传入b的版本。这是因为传b进去根本就通不过编译。

————————————————————————End——————————————————————————

#include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> #include "Lab3_2.h" #include "Demo3_2.h" #include "Demo3_3.h" using namespace std; // settings const unsigned int SCR_WIDTH = 1200; const unsigned int SCR_HEIGHT = 800; GLFWwindow* window; void framebuffer_size_callback(GLFWwindow* window, int width, int height); void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods); void processInput(GLFWwindow* window); void render(); void init(); void cleanup(); Lab3_2* lab3_2 = nullptr; //补注释 Demo3_2* demo3_2 = nullptr; Demo3_3* demo3_3 = nullptr; int sceneType = 1; //补注释 bool enableCullFace = false; //补注释 GLenum cullMode = GL_FRONT; //补注释 GLenum frontFace = GL_CCW; //补注释 int main() { //初始化glfw窗口 glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 创建窗口对象 window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Demo3", NULL, NULL); if (window == NULL) //窗口创建失败提示 { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); //补注释 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); //补注释 glfwSetKeyCallback(window, key_callback); //补注释 // 初始化glad if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } int nrAttributes; glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes); //补注释 std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl; init(); // 窗口消息循环 while (!glfwWindowShouldClose(window)) { processInput(window); // 输入 render(); // 渲染 glfwSwapBuffers(window); //补注释 glfwPollEvents(); } cleanup(); //释放内存 glfwTerminate(); //补注释 return 0; } void cleanup() { if (lab3_2) { delete lab3_2; } if (demo3_2) { delete demo3_2; } if (demo3_3) { delete demo3_3; } } void init() { lab3_2 = new Lab3_2(); lab3_2->setRenderParameter(); //补注释 demo3_2 = new Demo3_2(); demo3_2->setRenderParameter(); demo3_3 = new Demo3_3(); demo3_3->setRenderParameter(); } void render() { glClearColor(0.2, 0.3, 0.2, 1); //补注释 glClear(GL_COLOR_BUFFER_BIT); //补注释 if (sceneType == 1 && lab3_2) //补注释 { lab3_2->render(); } else if (sceneType == 2 && demo3_2) { demo3_2->render(); } else if (sceneType == 3 && demo3_3) { demo3_3->render(); } } void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { // 判断按键是否被释放 if (action == GLFW_RELEASE) //GLFW_RELEASEGLFW_PRESS的区别 { if (key == GLFW_KEY_1) sceneType = 1; else if (key == GLFW_KEY_2) sceneType = 2; else if (key == GLFW_KEY_3) sceneType = 3; else if (key == GLFW_KEY_4) sceneType = 4; else if (key == GLFW_KEY_E) { enableCullFace = !enableCullFace; //补注释 if (sceneType == 1 && lab3_2) { lab3_2->setRenderParameter(enableCullFace, cullMode, frontFace); } } else if (key == GLFW_KEY_C) //按C键切换绕向 { if (frontFace == GL_CCW) //如果当前为绕向为逆时针 { frontFace=GL_CW; //切换为顺时针 } else { frontFace = GL_CCW; } if (sceneType == 1 && lab3_2) { lab3_2->setRenderParameter(enableCullFace, cullMode, frontFace); } } else if (key == GLFW_KEY_F) //按键F切换裁剪面 { if (cullMode == GL_FRONT) //如果当前正面为裁剪面 { cullMode = GL_BACK; //切换成背面 } else { cullMode = GL_FRONT; } if (sceneType == 1 && lab3_2) { lab3_2->setRenderParameter(enableCullFace, cullMode, frontFace); } } } } void processInput(GLFWwindow* window) //补注释 { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); } // 窗口回调函数 void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); //补注释 }修改main.cpp,首先绘制三角形1(正面)和三角形2(背面),两个三角形要求具有不同的颜色,输出实验结果;将三角形正面进行裁剪,保留背面三角形,输出实验结果。
09-21
内容概要:本文介绍了一个基于MATLAB实现的无人机三维路径规划项目,采用蚁群算法(ACO)多层感知机(MLP)相结合的混合模型(ACO-MLP)。该模型通过三维环境离散化建模,利用ACO进行全局路径搜索,并引入MLP对环境特征进行自适应学习启发因子优化,实现路径的动态调整多目标优化。项目解决了高维空间建模、动态障碍规避、局部最优陷阱、算法实时性及多目标权衡等关键技术难题,结合并行计算参数自适应机制,提升了路径规划的智能性、安全性和工程适用性。文中提供了详细的模型架构、核心算法流程及MATLAB代码示例,涵盖空间建模、信息素更新、MLP训练融合优化等关键步骤。; 适合人群:具备一定MATLAB编程基础,熟悉智能优化算法神经网络的高校学生、科研人员及从事无人机路径规划相关工作的工程师;适合从事智能无人系统、自动驾驶、机器人导航等领域的研究人员; 使用场景及目标:①应用于复杂三维环境下的无人机路径规划,如城市物流、灾害救援、军事侦察等场景;②实现飞行安全、能耗优化、路径平滑实时避障等多目标协同优化;③为智能无人系统的自主决策环境适应能力提供算法支持; 阅读建议:此资源结合理论模型MATLAB实践,建议读者在理解ACOMLP基本原理的基础上,结合代码示例进行仿真调试,重点关注ACO-MLP融合机制、多目标优化函数设计及参数自适应策略的实现,以深入掌握混合智能算法在工程中的应用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值