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

陕西省建设工程协会网站大鹏外贸网站建设

陕西省建设工程协会网站,大鹏外贸网站建设,怎么申请做网站,2022年时事新闻摘抄前言 大家好我是程序猿爱打拳#xff0c;我们在学习完指针的基本概念后知道了指针就是地址#xff0c;我们可以通过这个地址并对它进行解引用从而改变一些数据。但只学习指针的基础是完全不够的#xff0c;因此学习完指针的基础后我们可以学习关于指针的进阶#xff0c;其中… 前言 大家好我是程序猿爱打拳我们在学习完指针的基本概念后知道了指针就是地址我们可以通过这个地址并对它进行解引用从而改变一些数据。但只学习指针的基础是完全不够的因此学习完指针的基础后我们可以学习关于指针的进阶其中包括指针数组、数组指针、函数指针等。这篇文章的末尾也有模拟实现计算器源码及讲解。 目录 1.字符指针 2.指针数组 3.数组指针 3.1数组名和数组名 3.2数组指针的定义 3.3数组指针的使用 4.数组参数、指针参数 4.1一维数组传参 4.2二维数组传参 4.3一级指针传参 4.4二级指针传参 5.函数指针 6.函数指针数组 6.1函数指针数组定义 7.实现计算器 7.1使用switch实现 7.2使用转移表实现 1.字符指针 经过学习指针的基础后我们知道了有一种指针类型为字符指针char*。一般这样写代码: #includestdio.hint main() {char ch a;char *p ch;*p b;printf(%c\n, ch);return 0; } 以上代码最终输出的值为b对指针p进解引用并赋新值从而改变了ch的值我们不难理解。还有一种写代码方式: #includestdio.hint main() {const char* p Hello World;printf(%s\n, p);return 0; } 输出结果 以上代码我们把Hello World的首字符地址赋值给了指针p并不是把整个Hello World赋值给了指针p因此在输出的时候是从H开始依次往后面输出的。当然我们在指针初阶学过以初始化一个字符串的时候字符串末尾会默认生成\0(结束标识符)。 在理解以上程序后我们来看一组代码 #includestdio.hint main() {char str1[] Hello World.;char str2[] Hello World.;const char* str3 Hello World.;const char* str4 Hello World.;if (str1 str2)printf(str1 and str2 are same\n);elseprintf(str1 and str2 are not same\n);if (str3 str4)printf(str3 and str4 are same\n);elseprintf(str3 and str4 are not same\n);return 0; } 输出结果: 以上代码可能有些朋友认为str1不是和str2一模一样吗为啥输出else后面的结果呢。其实是这样的。 str1和str2没有被const修饰的话是分别在内存中占不同的空间str3和str4两个字符串都被const修饰了因此占用的空间是一致的。所以str1不等于str2str3等于str4。 2.指针数组 在指针基础知识中我们学到了指针数组是存放指针的数组。如以下代码: int* arr1[3];//整型指针的数组char *arr2[4];//一级字符指针的数组int **arr3[5];//二级字符指针的数组 我们拿整型指针的数组来举例: #includestdio.hint main() {int arr1[2] { 1,2 };int arr2[2] { 3,4 };int arr3[2] { 5,6 };int* arr4[3] { arr1,arr2,arr3 };for (int i 0; i 3; i){for (int j 0; j 2; j){printf(%d, arr4[i][j]);}}return 0; } 输出结果: 以上代码中int *arry4[3]就是一个存放整型指针的数组它的每一个元素都存放的是一个地址这些地址分别是arr1arr2arr3的数组名也就是第一个元素的地址。通过这些个地址就能依次访问到这个地址及这个地址以后的内容如通过arr1的地址访问到了1和2。 3.数组指针 数组指针是什么呢指针还是数组其实它是指针。我们在指针初阶知道了整型指针可以这样定义int * p;说了了p指向的是一个整型。浮点型指针可以这样定义float * p;说明了p指向的是一个单精度浮点型。 3.1数组名和数组名 我们在数组学习的时候已经知道了数组名就是数组的首元素地址。那么数组名到底是什么呢我们来看一组代码: #includestdio.hint main() {int arr[2] { 3,4 };printf(arr %p\n, arr);printf(arr %p\n, arr);printf(arr1 %p\n, arr1);printf(arr1 %p\n, arr1);return 0; } 输出结果: 以上代码我们可以看到数组名和数组名还是有很大差异的。前两个结果看不太出后两个代码我们可以看出单个的数组名1也就是arr(首元素)1只是增长了4而数组名1也就是arr1却增长了8。我们知道整型是占四个字节而arr数组里面刚好有两个整型数字因此我们得到的结论是数组名是整个数组的地址。  3.2数组指针的定义 我们可以这样写:int (*p)[10];解释:首先*先和p结合说明p是一个指针其次int 和[10]结合。因此p指向的是一个有10个整型元素的数组。在3.1中我们知道了单个的数组名只是数组的首元素地址而数组名得到是整个数组的地址因此我们在初始化的时候应该这样:int (*p)[2]{arr1,arr2};以上为两个地址样式。 注意:[]号的优先级要高于*号所以必须加上()来保证p先和*结合。 3.3数组指针的使用 上面我们说到了数组指针代表着指针指向的是数组那么数组指针中存放的就是数组的地址了。比如: #includestdio.hvoid print_arr1(int(*arr1)[4],int x,int y) {for (int i 0; i x; i){for (int j 0; j y; j){printf(%d , arr[i][j]);}} }void print_arr2(int arr2[3][4], int x, int y) {for (int i 0; i x; i){for (int j 0; j y; j){printf(%d , arr2[i][j]);}} }int main() {int arr[3][4] { 1,2,3,4,5,6,7,8,9,10,11,12 };print_arr1(arr, 3, 4);printf(\n);print_arr2(arr, 3, 4);return 0; } 输出结果: 以上代码展示了数组指针的用法在函数print_arry1(arr,3,4)中数组名arr表示首元素的地址。也就是二维数组的第一行地址。所以int (*arr1)[4]接受的arr其实是第一行的地址可能有的朋友就有疑问了那为啥[]里面不是3而是4。因为二维数组的每一行有四个元素因此[]里面是4。 4.数组参数、指针参数 我们在写代码的时候难免会把数组或者指针传给函数那么函数里面的参数该如何设计呢下面我们来看四种情况。 4.1一维数组传参 #includestdio.hvoid test1(int arr[])//函数1 {} void test1(int arr[10])//函数2 {} void test1(int* arr)//函数3 {} void test2(int* arr[20])//函数4 {} void test2(int** arr)//函数5 {} int main() {int arr1[10] { 0 };int arr2[20] { 0 };test1(arr1);test2(arr2);return 0; } 函数1没问题数组传参过去函数未指定大小的数组接收可行。 函数2没问题数组传参过去函数指定了大小的数组接收可行。 函数3没问题数组传参过去函数中未指定大小的指针来接受可行。 函数4没问题数组传参过去函数中指定大小的指针来接收可行。 函数5没问题数组传参过去函数中未指定大小指针来接收可行。 4.2二维数组传参 #includestdio.hvoid tset(int arr[3][5])//函数1 {} void test(int arr[][])//函数2 {} void test(int arr[][5])//函数3 {} void test(int* arr)//函数4 {} void test(int(*arr)[5])//函数5 {} void test(int** arr)//函数6 {} int main() {int arr[3][5] { 0 };test(arr);return 0; } 函数1没问题二维数组传参函数中二维数组接收。 函数2有问题二维数组传参函数中二维数组不能省略列数。因为对一个二维数组来说可以不知道有多少行但不能不知道有多少列。这样才能方便计算。 函数3没问题二维数组传参可以省略行数。 函数4有问题二维数组传参函数中用一级指针来接收不可行。 函数5没问题二维数组传参函数中用数组指针来接受在外面3.3中有讲解到。 函数6有问题二维数组传参函数中用二级指针来接收不不可行因为二级指针接收的是一级指针而二维数组传过去的参数是第一个元素也就是第一行的地址。 4.3一级指针传参 我们直接来看一组代码: #includestdio.hvoid print(int* p, int sz) {for (int i 0; i sz; i){printf(%d\n, *(p i));} } int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10};int* p arr;int sz sizeof(arr) / sizeof(arr[0]);print(p, sz);return 0; } 以上代码中print函数就是一级指针的接收。在main函数中我们把arr的地址给了指针p因此print(p,sz)传参过去的就是arr的首元素地址和arr数组元素的个数。因此print函数可以通过首元素地址依次访问到该数组结束。 注意:sizeof操作符和符号对数组名进行操纵时此时的数组名代表的是整个数组。 4.4二级指针传参 #includestdio.hvoid test1(int** ptr1) {printf(num %d\n, **ptr1); }void test2(int** ptr2) {printf(num %d\n, **ptr2); }int main() {int num 10;int* p num;int** pp p;test1(pp);test2(p);return 0; } 输出结果: 以上代码为二级指针的接收。二级指针的接收可以是一级指针的地址也可以是二级指针的地址。但无论是接收那个一种解引用必须要解引用两次。 我们可以这样理解p指针里面存放的是numpp指针里面存放的是p。 5.函数指针 首先我们来看一组代码: #includestdio.hint Add(int x, int y) {return x y; }int main() {printf(%p\n, Add);return 0; } 输出结果: 我们发现函数也是有地址的因此我们可以把函数的地址存起来形成一个函数指针 以上个代码为例 #includestdio.hint Add(int x, int y) {return x y; }int main() {int (*p)(int, int) Add;return 0; } 以上代码为例我们可以这样存放函数的地址首先我们要用一个指针p来接受指针p的类型跟函数的返回类型一致(Add返回类型为int因此p的类型为int)其次指针p后面紧接着要说明函数的参数类型(Add参数为两个int因此p后面要说明参数类型为int,int)最后把函数的地址赋值给指针p。 注意: 1.函数名等同于函数名如AddAdd 2.函数指针中指针的类型根据函数的返回类型来定 3.函数指针后面要说明函数的参数类型 函数指针怎么用呢还是根据以上代码进行修改: #includestdio.hint Add(int x, int y) {return x y; }int main() {int (*p)(int, int) Add;int sum (*p)(4, 6);printf(sum%d\n, sum);return 0; } 输出结果:   我们已经知道了函数指针如何去赋值。用法也并不难只是把对应的数据放在函数指针后面的()里面即可实现功能。  6.函数指针数组 函数指针数组的作用是转移表转移表是什么呢 我们在写代码的时候会遇到使用switch语句的情况。当我们使用switch来编写代码的时候会发现得使用成千甚至上万条代码。但经过转移表的使用代码的篇幅将会大大减少。 6.1函数指针数组定义 我们在前几节学到了指针数组的用法如char* arr[10]存放的是字符指针此时arr数组的每个元素为char*。int* arr[10]存放的是整型指针此时arr数组的每个元素为int*。 那我们可不可以把函数指针存放在数组里面呢是可以的所以函数指针数组是存放函数指针的数组。它的定义方法如下: 我们在定义函数指针数组的时候需要要在函数指针的基础上加上一个[]。使得函数指针变为函数指针数组。[]里面为函数指针的个数。以下代码演示了如何在函数指针基础上改变方法。 #includestdio.hint Add(int x, int y) {}int main() {int (*p)(int, int) Add;//这是一个函数指针int (*p[5])(int, int) { Add };//这是一个函数指针数组return 0; } 以上代码中要注意的是: 1.函数指针数组定义时只是比函数指针多了一个[][]的个数代表着函数指针的个数。 2.函数指针数组在赋值的时候只能是地址。 3.函数名等同于函数名。 7.实现计算器 我们在认识道具函数指针数组的含义以及定义方式后我们可以用转移表的方式来实现计算器。 7.1使用switch实现 #includestdio.hvoid menu() {printf(************************\n);printf(* 1.Plu 2.Sub *\n);printf(* 3.Mul 4.Div *\n);printf(* 0.Exit *\n);printf(************************\n); }int Plu(int x, int y) {return x y; }int Sub(int x, int y) {return x - y; }int Mul(int x, int y) {return x * y; }int Div(int x, int y) {return x / y; }int main() {int input 0;int x 0;int y 0;int key 0;do{menu();printf(请输入你的选项:);scanf(%d, input);switch (input){case 0:printf(你已退出程序!);break;case 1:printf(请输入两个整数:);scanf(%d %d, x, y);key Plu(x, y);printf(两数之和为:%d\n,key);break;case 2:printf(请输入两个整数:);scanf(%d %d, x, y);key Sub(x, y);printf(两数之差为:%d\n, key);break;case 3:printf(请输入两个整数:);scanf(%d %d, x, y);key Mul(x, y);printf(两数之积为:%d\n,key );break;case 4:printf(请输入两个整数:);scanf(%d %d, x, y);key Div(x, y);printf(两数之商为:%d\n,key);break;default:printf(请输入正确的选项!\n);break;}} while (input);return 0; } 效果展示: 如果我们使用switch语句来实现这样一个简易的计算器我们会发现每当我要添加一个功能的时候。都需要增加一个case语句比如我要增加一个运算我得再加上一个case语句。因此我们可以使用函数指针数组(转移表)来实现会简易很多。 7.2使用转移表实现 #includestdio.hint Plu(int x, int y) {return x y; }int Sub(int x, int y) {return x - y; }int Mul(int x, int y) {return x * y; }int Div(int x, int y) {return x / y; }int main() {int input 1;int x 0;int y 0;int key 0;int (*p[5])(int x, int y) { 0,Plu,Sub,Mul,Div };while (input){printf(************************\n);printf(**** 1.Plu 2.Sub ****\n);printf(**** 3.Mul 4.Div ****\n);printf(**** 0.Exit ****\n);printf(************************\n);printf(请输入你的选项:);scanf(%d, input);if ((input 4 input 1)){printf(请输入两个整数:);scanf(%d %d,x,y);key (*p[input])(x, y);printf(得到的结果为:%d\n, key);}else{if (input ! 0){printf(请输入正确的选项!\n);}else{printf(您已退出程序!);break;}}}return 0; } 效果显示: 以上代码如果我们想要增加程序的功能只需要添加函数、增加菜单栏内容、if语句的判断条件即可。 以上就是本篇博客的内容感谢你的阅读 Never Give Up
http://www.hkea.cn/news/14391219/

相关文章:

  • 电商商城网站建设方案国内贸易平台
  • 展馆设计说明范文seo won jin
  • 大庆免费网站建设金华金义东轨道建设网站
  • 焦作网站开发广东省东莞市
  • 安陆建设局网站wordpress使用多说头像
  • 网站开发不懂英语买购网中国10大品牌网
  • .net 网站 iis 配置小米发布会直播入口
  • 网站服务器是什么意思上海市人才服务中心网首页
  • 网站维护一般需要多久时间网站开发能封装成app吗
  • 做城市网站的标语做网站公司怎么赚钱吗
  • 网站的页面动态需要哪些方法做南宁微信公众号开发
  • 网站建设项目需求书公司网站的建设流程
  • 承德网站建设案例做app网站的软件
  • 世界最受欢迎的免费架站平台html个人主页代码编写
  • 深圳网站seo推广西安网站建设 招聘
  • ppt做视频的模板下载网站h5彩票网站怎么做
  • 昆山规划与建设局网站关键词优化排名有哪些牛霸天的软件1
  • 发布文章后马上更新网站主页房地产设计管理的思路
  • 做网站怎么开后台网站建设功能最全的软件
  • 在哪网站可以做农信社模拟试卷国际营销信息系统
  • 网站源码官网华为商城网站建设
  • ai怎么做自己的网站弘泽建设集团网站
  • 黄埔商城网站建设discuz可以做门户网站吗
  • 网站可视化后台wordpress自动发布模块
  • 郓城那家网站做的好合肥商务科技学校网站建设
  • 奉化建设局网站如何制作app软件下载
  • 音乐网站怎么做社交的旅游网站模块
  • 池州网站建设兼职百度拍照搜题
  • 做网站建设业务如何新建网页
  • 珠宝网站官网建设需求项目之家app