深圳做网站哪家公司最好公司logo设计费

张小明 2026/1/7 14:59:47
深圳做网站哪家公司最好,公司logo设计费,智慧团建app,江苏网站开发多少钱1.指针理解 首先我们看一段程序#xff0c;如下#xff1a; #include stdio.hint main(void) {char ch;char* pc ch;*pc H;printf(%c, ch);return 0; } 我们可以看到这是指针最基本的用法#xff0c;那么我们现在来深入理解一下这段程序#x…1.指针理解首先我们看一段程序如下#include stdio.h int main(void) { char ch; char* pc ch; *pc H; printf(%c, ch); return 0; }我们可以看到这是指针最基本的用法那么我们现在来深入理解一下这段程序char ch编译器在执行了这句话后就会在内存中开辟一段内存而对于该段内存就会有一个地址这个地址就像是这段内存空间的一个门牌号用来帮助编译器在后面我们要用到该段程序时知道该空间。那么对于char就是类型通过这个类型编译器可以知道要开辟的空间的大小即1个字节大小。那么我们现在来思考一下ch是什么呢ch是一个变量名对吧但是编译器怎么通过这个变量名就找到了那块空间呢我们前面讲到地址才是编译器找到内存空间的标识那么我们来好好理解一些这个变量ch变量的本质是标识符与内存地址的绑定它代表了一个可以存储数据的内存空间在编译时变量名会被编译器自动的与内存地址映射起来就可以找到对应的空间了。这也就是c/c这些高级语言的一个表现变量名给我们使用的人看但是底层编译会自动转化为地址。所以接下来的char*pcch,就好理解了这也是语言的通行就是开辟了一个char*类型内存大小的空间pc就是这块空间的一个标识符然后这块空间存放的就是ch这变量名绑定的那块空间的地址。所有通过pc我们并不能直接找到ch变量名的那块空间故我们又要引用到了一个操作符*来通过该操作符让其解引用然后就指向到了ch的那块空间复制后ch空间下的值也被修改了。我们可以通过下图来更好的理解2.指针类型理解我们看下面这段程序#include stdio.h int main(void) { int num 512; char* p num; printf(%d, *p); return 0; }num是int类型但是我们的指针是char*类型运行后我们看输出结果如下可见所得是0这是为什么呢我们知道int类型开辟的空间是4个字节但是char类型开辟的是1个字节所以char*类型的指针指向的虽然是num空间但是却只指向一个字节空间我们看其中的空间分布图所以输出的就是0了。我们再看下面这段程序#include stdio.h int main(void) { int num 512; char* p num; *p 1; printf(%d, num); return 0; }输出结果如下可见用char*类型的指针来进值得操作时也只会对它所指向得那块空间有影响。我们可以看看内存分布如下所以指针类型其实本质就是指向那块空间的大小。但是要注意的是在C中上面这段程序会报错因为c的语法更加严格了。3.指针运算理解我们看下面这段程序#include stdio.h int main(void) { int arr[4] { 10,20,30,40 }; int* p1 arr[3]; int* p2 arr[0]; printf(%d, p1 - p2); printf(%d, (unsigned int)p1 - (unsigned int)p2); return 0; }看结果我们可以看到两个运算得到的结果不一样了首先一个直接对p1和p2指针进行减法运算得到的是两个指针之间的元素个数这个元素个数所说的其实就是你指定的指针类型的这样字的空间有几块比如我的指针类型是int*所以两者相减的其实就是这两个指针间有几块4字节大小空间我们可以验证一下如下我们将程序修改为下面的程序#include stdio.h int main(void) { int arr[4] { 10,20,30,40 }; //int* p1 arr[3]; //int* p2 arr[0]; char* p1 arr[3]; char* p2 arr[0]; printf(%d\n, p1 - p2); printf(%d\n, (unsigned int)p1 - (unsigned int)p2); return 0; }结果如下也就验证了我上面所说的观点。接着我们来理解一下(unsigned int)p1 - (unsigned int)p2这句程序该句程序就是将地址强转为了无符号整形然后进行减法运算所以得到的就是整形减整形的值。对其的强转其实就是改变了编译器在访问时的访问类型。为什么上面两者的结果会这样子呢我们来看看其中的汇编会更加清楚如下我们注意到其中一句汇编sar eax2可以在我们地址相减后得到的eax值在执行的时地址减法运算时eax右移了2位即除以了4而在将地址转化为整数后再相减就没有做此处理这也说明了其二者值不一样的原因。4.指针和数组名的关系我们知道了指针和数组的关系如可以通过指针来操作数组数组每个元素取出地址也可以赋值给指针操作特别的我们知道数组名的地址和数组首元素地址一样我们可以通通过指针来遍历数组也可以通过数组下标来遍历数组。下面我们来深入理解一下数组名和指针的关系看下面这段程序#include stdio.h int main(void) { int arr[4] { 10,20,30,40 }; int* p1 arr; printf(%d\n, *arr); printf(%d\n, *p1); return 0; }运行后结果如下可见两者的输出结果都是10但是这两者是一样的嘛我们再看下面这段程序#include stdio.h int main(void) { int arr[4] { 10,20,30,40 }; int* p1 arr; printf(%d\n, arr); printf(%d\n, *p1); int a 100; arr a; p1 a; return 0; }运行后如下可见p1指针可以改变指向而arr却不能改变指向。再看下面这段程序#include stdio.h int main(void) { int arr[4] { 10,20,30,40 }; int* p1 arr; printf(%d\n, sizeof(arr)); printf(%d\n, sizeof(p1)); return 0; }运行后可见数组名和指针有着相似性但是又不是一样的接下来我们就来深入理解一下这两者。首先看下图可见p1的类型为int*但是arr的类型为int[4],p1指向的是单个的int但是arr指向的是4个int也就是整个数组编译器在识别p1时就只会识别到一个int而在识别arr时识别的时整个数组这是在早年c语言创建时为了操作数组的高效性所定义的。5.指针与const的应用第一种就是我们不加const我们称为自由指针可以更换指针的指向也可以更改指针指向内容的值。如下#include stdio.h int main(void) { int a 100; int arr[4] { 10,20,30,40 }; int* p1 arr; p1 a; *p1 10; return 0; }第二种就是在指针类型前面加上const该指针可以改变指向但是不能改变指向内容的值。如下第三种就是在指针变量前加上const 该指针不可以改变指针的指向但是可以改变指向的内容的值如下第四种在指针类型和指针变量之前都加上const该指针既不可以改变指向也不可以改变指向内容的值如下指针与const的联动常用于在给程序员定义接口时使用防止实现接口的程序员对不需要进行修改的值不小心进行了修改导致出现意外错误。6.函数参数传递二维数组对于二维数组作为参数进行传递有下面几种常用方法第一种#include stdio.h void add(int array[][4] , int n) { int sum 0; for (int i 0; i n; i) { for (int j 0; j 4; j) { sum array[i][j]; } } printf(sum%d, sum); } int main(void) { int a 100; int arr[2][4] { 10,20,30,40, 50,60,70,80}; add(arr, 2); return 0; }这种写法比较明确可以很清楚的看出传入该函数的参数是一个二维数组。在编译时会将该参数理解为int (*array)[4]。第二种#include stdio.h void add(int (*array)[4] , int n) { int sum 0; for (int i 0; i n; i) { for (int j 0; j 4; j) { sum array[i][j]; } } printf(sum%d, sum); } int main(void) { int a 100; int arr[2][4] { 10,20,30,40, 50,60,70,80}; add(arr, 2); return 0; }这种写法也比较明确而且可以明确的看出该array就是一个二维数组的指针。第三种#include stdio.h void add(int *array, int n , int m) { int sum 0; for (int i 0; i n; i) { for (int j 0; j m; j) { sum array[i*mj]; } } printf(sum%d, sum); } int main(void) { int a 100; int arr[2][4] { 10,20,30,40, 50,60,70,80}; add(arr, 2,4); return 0; }当使用第三种方式来对二维数组进行参数传递时array就是一个指向数组首元素的地址没有了二维数组的属性所以不能使用上面两种通过array[i][j]的形式来访问二维数组了所以我们可以通过上面的一维数组的访问形式来访问其实也就是指针形式来访问以为指针也可以通过数组下标形式来进行访问。7.函数指针函数指针是一个指向函数入口地址的指针通过该指针可以实现对函数的调用。那么该函数指针的声明类型应该如何写呢如下数据类型 (*函数指针名称)(参数说明列表)。其中数据类型就是函数的返回值类型函数指针名称就是你相想要给该指针取得名称参数说明列表就是你函数得形参列表。程序如下#include stdio.h int add(int a, int b) { return a b; } int main(void) { int m 10; int n 20; int (*p)(int,int) NULL; p add; printf(%d, (*p)(m, n)); return 0; }
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

.net 创建网站项目the7做的网站

在移动应用竞争白热化的今天,登录体验已成为决定用户留存的关键因素。Vant作为轻量级Vue移动端UI库,通过巧妙组合核心组件,让生物识别登录从复杂技术难题变成简单配置任务。本文揭秘如何用Vant实现指纹和面容识别的极致体验。 【免费下载链接…

张小明 2026/1/6 6:20:53 网站建设

旅游网站设计页面wordpress新建音乐界面

comsol电力变压器有限元仿真,二维,三维,主要做损耗,短路力,阻抗,温升,电场。在电力系统领域,电力变压器作为关键设备,其性能的准确评估至关重要。Comsol Multiphysics 这…

张小明 2026/1/5 4:04:17 网站建设

网站建设与推广的步骤今天国际新闻最新消息

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告)远程调试控屏包运行 三、技术介绍 Java…

张小明 2026/1/4 14:42:33 网站建设

网站设计项目总结贵阳设计网站建设

Apache Doris与腾讯云COS集成:企业级数据湖架构设计与实施指南 【免费下载链接】doris Apache Doris is an easy-to-use, high performance and unified analytics database. 项目地址: https://gitcode.com/gh_mirrors/dori/doris 云端数据集成已经成为现代…

张小明 2026/1/4 19:46:12 网站建设

空间站 对接兰州网站做的好点的公司

百度网盘提取码自动获取神器:告别手动搜索的烦恼 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经遇到过这样的场景?深夜急需下载学习资料,却因为找不到百度网盘提取码而焦头烂额&…

张小明 2026/1/7 3:10:39 网站建设

平安车险官方保险网站做h5的网站的区别

PULC超轻量图像分类方案终极实战指南 【免费下载链接】PaddleClas A treasure chest for visual classification and recognition powered by PaddlePaddle 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleClas 你是否曾在图像分类项目中面临这样的困境&#xff1a…

张小明 2026/1/6 6:19:21 网站建设