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

苏州专业做网站较好的公司南宁网站建设公司哪个好

苏州专业做网站较好的公司,南宁网站建设公司哪个好,珠宝怎么做网站,软文形式推广产品目录 一、字符指针 1.1 ❥ 使用场景 1.2 ❥ 有关字符串笔试题 二、数组指针 2.1 ❥ 数组指针变量 2.2 ❥ 数组指针类型 2.3 ❥ 数组指针的初始化 三、数组指针的使用 3.1 ❥ 二维数组和数组名的理解 3.2 ❥ 二维数组传参 四、函数指针 4.1 ❥ 函数的地址 4.2 ❥ 函数…目录 一、字符指针 1.1 ❥ 使用场景 1.2 ❥ 有关字符串笔试题 二、数组指针 2.1 ❥ 数组指针变量 2.2 ❥ 数组指针类型 2.3 ❥ 数组指针的初始化 三、数组指针的使用 3.1 ❥ 二维数组和数组名的理解 3.2 ❥ 二维数组传参 四、函数指针 4.1 ❥ 函数的地址 4.2 ❥ 函数指针变量 4.3 ❥ 函数指针变量的使用 五、函数指针数组 六、转移表 一、字符指针 字符指针指向字符的指针  1.1 ❥ 使用场景 【使用场景一】 #include stdio.hint main() {char c w;char* pc c;*pc x;printf(%c\n, *pc);return 0; } 【使用场景二】 #include stdio.hint main() {char* p abcdef;//这里把首字符a的地址赋给了变量pprintf(%s\n, p);return 0; } 注意 这里printf中%s的格式逻辑是从给定的地址处开始逐个向后输出字符直到遇见结束标记\0为止。解引用的操作符在printf函数内部造成。 如果由用户解引用那printf函数将只能拿到单个字符反而无法实现功能。 易错点1 场景二中如果修改*p的值代码就会报错。报错类型如下 原因 abcdef是个常量字符串。 常量字符串的意思是这个字符串本身是不能被更改的。 而这个*p没有被限制它其实是可以去改变后面的字符串的所以char* pabcdef; 报警告是正常的。 防止方法在char*p 前加const 易错点2 不能解引用p解引用打印的是一个字符一个字符不能用%s打印。 char* p abcdef; printf(%s, *p);//error 以下是将字符串放在数组里面 char arr[] abcdef; 而数组的内容是可变的。 1.2 ❥ 有关字符串笔试题 #include stdio.hint main() {char arr1[] hello;char arr2[] hello;const char* p1 hello;const char* p2 hello;if (arr1 arr2)printf(arr1arr2\n);elseprintf(arr1!arr2\n);if (p1 p2)printf(p1p2\n);elseprintf(p1!p2\n);return 0; } 运行结果如下 原因如下 arr1!arr2 我们知道arr1和arr2是数组首元素的地址这两个数组是两块独立的内存空间它们只是存储的内容相同都是hello字符串。 p1p2 这里的p1和p2指向的是同一个常量字符串。c/c会把常量字符串存储到一个单独的一个内存区域当几个指针指向同一个字符串的时候它们实际会指向同一块内存代码段中。arr1arr2p1p2都是放在栈区指向的hello常量字符串是放在代码段。 二、数组指针 整型指针存放整型变量的地址能够指向整型数据的指针 浮点型指针存放浮点型变量的地址能够指向浮点型数据的指针 那数组指针存放数组的地址指向数组的指针 2.1 ❥ 数组指针变量 看下面两行代码p1p2分别是什么 int* p1[10]; int(*p2)[10]; p1是指针数组 p1是数组名该数组里存放了10个元素每个元素是int*类型 p2是数组指针 因为p2先和*结合说明p是一个指针变量然后指向一个大小为10个整型的数组所以p是一个指针指向一个数组所以叫数组指针。 注意 [ ]的优先级要高于*号所以必须加上来保证p先和*结合。int*p2[10];里面的*不是解引用的意思这颗星就代表是指针只有前面不加类型的时候才是解引用。 2.2 ❥ 数组指针类型 去掉指针变量名就是指针(变量)的类型。 看如下代码 它们跳过的字节不同就是因为他们的类型不同导致。 注意 一个指针是否是野指针取决于你是否用它。这个指针虽然指向这里但是没有产生坏的结果。只要不使用它就没关系。虽然它指向的空间不属于“我”但是它并不危险。 2.3 ❥ 数组指针的初始化 数组指针存放的是数组的地址。 所以初始化的时候要给整个数组的地址。代码如下 注意 [ ]里的元素个数不能省略不然编译器会自动认为是数组元素个数为0 三、数组指针的使用 3.1 ❥ 二维数组和数组名的理解 首先我们来理解一下二维数组及其数组名 在c语言中只有一维数组N维数组的元素是数组数组名作为指针时永远指向第一个元素。 如 数组a[3];  *aa[0]数组a[3][4];  *aa[0]   只不过这时候a[0]又是一个数组。 这时候的a[0]又是指向它自己元素的第一个元素又有 *a[0]a[0][0] 这种方式可以推广到N维数组所有数组直接对数组名取地址如a得到的指针指向该数组而不是指向第一个元素。注意这点区别。 举个例子  int board[3][4]; board一维数组的地址。 二维数组的数组名数组名就是首元素地址。我们知道可以把一维数组看作二维数组的元素。所以board就是一维数组的地址。 board取出的是整个二维数组的地址。 board[0]第一行第一个元素的地址。 解引用相当于拿到第一行数组的数组名也就是首元素地址即第一行第一个元素的地址。 board[0]*boardboard[0][0] board[0]第一行的地址。 boardboard[0] 3.2 ❥ 二维数组传参 清楚了上面的概念之后我们来看下面一段代码 之前二维数组传参时形参部分用的是数组接收。 #include stdio.hvoid test(int a[3][5], int r, int c) {int i 0;int j 0;for (i 0; i r; i){for (j 0; j c; j){printf(%d , a[i][j]);}printf(\n);} }int main() {int arr[3][5] { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };test(arr, 3, 5);return 0; } 发现实参arr是数组名通过刚才的分析直到数组名是首元素地址首元素地址就是第一行的地址也就是一维数组的地址那么它的类型就是数组指针类型。 那么实参就可以写成数组指针的形式代码如下 #include stdio.hvoid test(int(*p)[5], int r, int c)//数组指针 {int i 0;int j 0;for (i 0; i r; i){for (j 0; j c; j){printf(%d , *(*(p i) j));//指针解引用}printf(\n);} }int main() {int arr[3][5] { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };test(arr, 3, 5);return 0; }问题为什么*(pi) 跳过的是一行数组 回答 数组的类型决定了它1跳过几个字节。 p的类型是int*[5]; p是指向一个整型数组的数组5个元素 int [5] p1 跳过一个5个int元素的数组 四、函数指针 函数指针存放函数的地址指向函数的指针 4.1 ❥ 函数的地址 函数是否有地址呢我们来测试一下 由测试结果可知函数存在地址取函数名和函数名拿到的都是函数的地址。 4.2 ❥ 函数指针变量 我们通过函数指针来存储函数的地址。 int (*pf) (int x, int y) Add; int (*pf) (int , int ) Add;//xy可以省略只写类型地址要存起来放到指针变量里去。pf是变量名*pf说明是指针指向的是函数所以加上括号。函数的参数是int (参数名写不写无所谓只要类型交代清楚即可)函数的返回值类型也是int。 int (*pf) (int x, int y) |      |    ------------ |      |        | |      |        pf指向函数的参数类型和个数的交代 |       函数指针变量名 pf指向函数的返回类型int (*) (int x, int y) //pf函数指针变量的类型4.3 ❥ 函数指针变量的使用 通过函数指针调用指针指向的函数。 代码如下 #include stdio.h int Add(int x, int y) {return x y; } int main() {int(*pf)(int, int) Add;printf(%d\n, (*pf)(2, 3));//输出结果为5printf(%d\n, pf(2, 3));//输出结果为5return 0; }把函数的地址存到pf里通过解引用pf找到函数找到这个函数要调用这个函数调用函数需要传参所以传参)传2,3。这样的话它会把2和3相加得到5。 问题一为什么*pf必须带上括号呢 回答因为假如不带上括号调用返回5就会对5进行解引用。 问题二为什么能写成pf(2, 3)这种形式 回答在C语言里pf前的*其实是个摆设可以不写也可以写多个。 这是个技术细节问题不涉及到语法原则从不同的思考角度出发观点会略有不同但不影响C语言实践初学者也不必过多纠结。 应用通过函数指针的方式进行调用 #include stdio.hint Add(x, y) {return x y;} void cale(int(*pf)(int,int)) {int a 3;int b 5;int ret pf(a, b);printf(%d\n, ret); } int main() {cale(Add);return 0; } 这里的cale没有直接调用Add函数而是通过函数指针的方式进行调用。 五、函数指针数组 函数指针数组把一个函数的地址存放到一个数组中。 是个函数指针类型的数组。 去掉 函数名[ ] 就是该数组的类型。 int (*parr[3])( ); 解释parr先和[ ]结合说明parr是数组数组的内容是int(*)()类型的函数指针。 当对函数指针数组进行初始化的时候后面初始化的可以省略掉数组的大小它会根据后面初始化的内容来确定数组的大小。 例如 int(*p[5])(int x, int y) { 0, add, sub, mul, div }; int(*p[])(int x, int y) { 0, add, sub, mul, div }; 六、转移表 使用了函数指针数组避免大篇幅地修改内容也可实现跳转的功能。 所以函数指针数组也叫转移表。 计算机的一般实现 #define _CRT_SECURE_NO_WARNINGS 1#include stdio.hint add(int a, int b) {return a b; } int sub(int a, int b) {return a - b; } int mul(int a, int b) {return a * b; } int div(int a, int b) {return a / b; } int main() {int x, y;int input 1;int ret 0;do{printf(————----------------------\n);printf(1.add 2.sub \n);printf(3.mul 4.div \n);printf(0.exit \n);printf(————----------------------\n);printf(请选择);scanf(%d, input);switch (input){case 1:printf(输入操作数);scanf(%d %d, x, y);ret add(x, y);printf(ret %d\n, ret);break;case 2:printf(输入操作数);scanf(%d %d, x, y);ret sub(x, y);printf(ret %d\n, ret);break;case 3:printf(输入操作数);scanf(%d %d, x, y);ret mul(x, y);printf(ret %d\n, ret);break;case 4:printf(输入操作数);scanf(%d %d, x, y);ret div(x, y);printf(ret %d\n, ret);break;case 0:printf(退出程序\n);break;default:printf(选择错误\n);break;}} while (input);return 0;} 使用函数指针数组的实现 #include stdio.hint add(int a, int b) {return a b; }int sub(int a, int b) {return a - b; }int mul(int a, int b) {return a * b; }int div(int a, int b) {return a / b; }int main() {int x, y;int input 1;int ret 0;int(*p[5])(int x, int y) { 0, add, sub, mul, div }; //转移表do{printf(————----------------------\n);printf(1.add 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);ret (*p[input])(x, y);printf(ret %d\n, ret);}else if (input 0){printf(退出计算器\n);}else{printf(输入有误\n);}} while (input);return 0; }
http://www.dnsts.com.cn/news/66374.html

相关文章:

  • 中国做跨境电商出口的网站上海单位建设报建网站
  • 联科网站建设天眼通查公司查询入口
  • 深圳物流公司电话号码网站文章在哪发布做seo
  • 软件下载网站哪个比较好广告设计与制作学啥
  • 深圳网站建设制作开发企业网络推广运营技巧
  • 惠州有做网站的吗自己怎么做卡盟网站
  • 什么网站可以找人做设计一个做网页的网站
  • 网站文字规范平面设计主要做的是什么
  • 池州网站建设哪家好网站访问量怎么赚钱
  • 本地搭建多个网站湖南网站建设seo优化
  • 做网站个人九讯鹿网站建设
  • cdn网站网络加速器网站怎么做3d商品浏览
  • 网站横条广告中国建设银行官网招聘信息
  • 网站建设大致价格2017宁波公司网站开发
  • 益阳学校网站建设免费ppt模板下载软件有哪些
  • 建设网站的个人心得外贸推广的网站
  • 黑龙省建设厅网站首页单位建设网站申请信用卡
  • 微信小程序可以做电影网站吗淘客网站怎么做百度
  • 建设网站公司 昆山无锡网站制作
  • 北京网站建设seo网站建设及托管合同模板
  • 网站内容告知书广州网站建设公司品牌
  • 网站图片搜索技术哪里可以做宁波建站公司哪家服务好
  • 网站建设优化规划书建设网站的工具
  • 网站建设网站推广服务公司北京专业的网络seo
  • 商铺免费做的网站门户网站开发 价格
  • 怎样查看网站的权重互联网营销培训班
  • 网站设计管理方向贵州建设工程信息网官网
  • 辽宁省建设网站人力外包公司到底值不值得去
  • 网络公司网站建设方案wordpress 搜索排除
  • 网页设计与网站建设标准教程电子商务网站建设 大纲