【C语言进阶】指针进阶
今日所做之事勿候明天,自我所做之事勿候他人。 --歌德
目录
指针进阶(更深层次的理解):
一.字符指针
二.指针数组
三.数组指针
1.数组指针的定义:
2.&数组名和数组名:
3.数组指针的使用:
四.数组参数,指针参数
1.一维数组传参:
2.二维数组传参:
3.一级指针传参:
4.二级指针传参:
五.函数指针:
六.函数指针数组:
七.指向函数指针数组的指针:
八.回调函数
指针进阶(更深层次的理解):
前言:
之前我们已经学习了指针的初阶,接下来我们将进入指针的进阶了,更加深刻的理解指针。
先回忆一下指针的简单知识:
1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
2.指针的大小是固定的4/8个字节(32位平台/64位平台)。
3.指针是有类型的,指针的类型决定了指针的±整数的步长,指针的解引用操作的时候的权限。
4.指针的运算。
一.字符指针
字符指针就是类型为char*。
int main()
{char ch = 'a';char* p = &ch;//p就是一个字符指针return 0;
}
int main()
{char* p1 = "abcdef";//这里字符串表达式的值就是首字符的地址//把字符串首元素的地址存放在p中//可以把它理解为字符串数组char arr[] = "abcedf";char* p2 = arr;//唯一的区别就是p2指向的是数组的首元素,而数组的可以修改的。//但是p1是不能修改的,因为p1对应的是常量字符串*p2 = 'h';printf("%s", arr);return 0;
}
当我们修改了常量字符串会发现什么呢?
int main()
{char* p1 = "abcdef";*p1 = 'h';return 0;
}
所以常量字符串是不能修改的。
面试题:
int 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;
}
总结:常量的字符串是不能修改的。而数组里面的字符串是可以修改的。
二.指针数组
指针数组本质上是数组,数组里的内容是指针。
字符指针数组:
int main()
{char* arr[] = { "abcdef","hello","nihao" };//这就是一个字符类型的指针数组int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%s\n", arr[i]);//arr[i]就是字符串首元素的地址//通过首元素的地址就可以打印整个字符串}return 0;
}
整型指针数组:
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 6,7,8,9,10 };int arr3[] = { 11,12,13,14,15 };int* arr[] = { arr1,arr2,arr3 };//整型的指针数组int i = 0;int j = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){for (j = 0; j < 5; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
因为arr[i]=*(arr+i),所以这里打印我们还可以写成*(*(arr+i)+j)和*(arr[i]+j)。
三.数组指针
1.数组指针的定义:
数组指针不是数组,而是指针,是指向数组的指针,指针存放的是数组的地址。
int main()
{int arr[5] = { 1,2,3,4,5 };int(*pa)[5] = &arr;//这里的p就是数组指针,记得*和pa一定要括起来,不然就是指针数组了return 0;
}
2.&数组名和数组名:
数组名其实是数组首元素的地址,这个是毋庸置疑的。
但是有两个例外:
1.sizeof(数组名),数组名如果单独放在sizeof内部,这里的数组名表示整个数组,计算的是整个数组的大小。
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
#include<stdio.h>
int main()
{int arr[10] = { 0 };printf("%p\n", arr);printf("%p\n", arr+1);printf("%p\n", &arr[0]);printf("%p\n", &arr[0] + 1);printf("%p\n", &arr);printf("%p\n", &arr + 1);return 0;
}
这里可以看出arr和&arr[0]和&arr的地址是一样的,分别加1的地址也是一样的,这就可以说明数组名是首元素的地址是完全没问题的。
不是说&arr是全部的地址吗?那为什么和arr的地址是一样的呢?但是当&arr+1的地址就完全不一样了。
printf("%p\n", &arr);//地址0133FB1C
printf("%p\n", &arr + 1);//地址0133FB44
地址:01333FB1C和0133FB044总共差16进制的28,28转换为十进制是40,由此得出&arr+1跳过的是整个数组40个字节。
但&arr和arr的地址是一样的呢?因为它们都是从首地址开始的,虽然它们的值是一样的,但是他们所表达的含义是不同的。
3.数组指针的使用:
常规指针的用法打印数组内容:
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;int i = 0;for (i = 0; i < 10; i++){printf("%d ", *(p + i));}return 0;
}
数组指针打印(用的很少,不提倡使用):
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int(*p)[10] = &arr;//p--&arr//*p--*&arr//*p--arrint i = 0;for (i = 0; i < 10; i++){printf("%d ", (*p)[i]);}return 0;
}
使用数组指针打印二维数组:
void print(int(*p)[5], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){//printf("%d ",p[i][j]);printf("%d ", *(p[i] + j));}printf("\n");}}
int main()
{int arr[2][5] = { 1,2,3,4,5,6,7,8,9,10 };print(arr, 2, 5);//数组名arr,表示首元素的地址//但是二维数组的首元素是二维数组的第一行//所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址//可以用数组指针来接收return 0;
}
这里有一道题我们就可以来理解一下二维数组的数组名的含义:
int main()
{int aa[2][5] = {10,9,8,7,6,5,4,3,2,1};int *ptr1 = (int *)(&aa + 1);//&数组名是整个数组int *ptr2 = (int *)(*(aa + 1));printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;
}
&aa的类型是int (*)[2][5],加一操作会导致跳转一个int [2][5]的长度,直接跑到刚好越界的位置。减一以后回到最后一个位置1处。*(aa + 1)相当于aa[1],也就是第二行的首地址,自然是5的位置。减一以后由于二维数组空间是连续性的,会回到上一行末尾的6处。
int arr[5];
int* arr[5];//指针数组
int(*arr)[5];//数组指针
int(*pa[10])[5];//这个怎么理解呢
pa是和[10]连在一起的,所以pa是一个数组,而数组里面是10个指针,而指针里面又是数组。
相当于数组里面是数组指针。
理解:
四.数组参数,指针参数
1.一维数组传参:
//一维数组传参
void test(int arr[])//数组接收没问题
{}
void test(int arr[10])//数组接收没问题
{}
void test(int *arr)//指针接收没问题
{}
void test2(int *arr[20])//指针数组接收也没问题
{}
void test2(int **arr)//指针接收也没问题,类型和原类型一样,都是int*
{}
int main()
{int arr[10] = { 0 };int* arr2[20] = { 0 };test(arr);test2(arr2);return 0;
}
2.二维数组传参:
//二维数组传参
void test(int arr[3][5])//使用二维数组当形参,没问题
{}
void test(int arr[][])//不能省略列,可以省略行
{}
void test(int arr[][5])//可以
{}
void test(int* arr)//不可以
{}
void test(int *arr[5])//使用指针数组不行
{}
void test(int(*arr)[5])//使用数组指针可行
{}
void test(int **arr)//使用二级指针更不可行
{}
int main()
{int arr[3][5] = { 0 };test(arr);//这里的arr代表第一行的地址,只能用数组指针来接收
}
3.一级指针传参:
//一级指针传参
void print(int* p, int sz)//使用指针接收,也可以使用数组接收
{int i = 0;for (i = 0; i < sz; i++){printf("%d\n", *(p + i));}
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9 };int* p = arr;int sz = sizeof(arr) / sizeof(arr[0]);print(p, sz);return 0;
}
4.二级指针传参:
//二级指针传参
void test(int** ptr)//二级指针接收
{printf("num=%d\n", **ptr);//第一次解引用找到p,第二次解引用找到num=10
}
int main()
{int num = 10;int* p = #int** pp = &p;//pp就是&ptest(pp);test(&p);return 0;
}
五.函数指针:
函数指针就是指向函数的指针。函数有地址吗?
int Add(int x, int y)
{return x + y;
}
int main()
{printf("%p\n", &Add);printf("%p\n,Add");//&函数名就是函数的地址return 0;
}
所以&函数名和函数名是一样的,没有区别。
int Add(int x, int y)
{return x + y;
}
int main()
{int (*pa)(int, int) = Add;//pa就是一个指向函数的函数指针//int(*)(int,int)就是pa的类型//参数和返回类型是和函数是一一对应的,这里的参数x,y可以不写int ret = (*pa)(3, 5);//这里的(*pa)只是为了方便理解,不写*也是可以的//int ret = Add(3, 5);//int ret = pa(3, 5);printf("%d\n", ret);return 0;
}
这里我们来理解两个比较复杂的表达式:
第一个:
int main()
{(*( (void (*)()) 0 ) )( )//我们如何来里理解这个代码呢//首先我们看最里面void(*)()这就是一个函数指针类型,无返回类型,无参数//然后(void(*)())0就是把0强制转换为void(*)()这个函数指针//然后(*( (void (*)()) 0 ) )这个就是函数的解引用操作//最后再加个括号,(*((void (*)()) 0))(),整个代码就是一次函数调用return 0;
}
第二个:
int main()
{void (*signal(int, void(*)(int)))(int); //signal先和后面的括号结合,第一个参数是int,第二个参数是void(*)(int)类型的函数指针//该函数指针指向的函数参数是int,返回类型是void//signal(int, void(*)(int))这个的返回类型又是void(*)(int)//函数名也有,返回类型也有,参数也有,这个整体的代码就是一个函数的声明//就可以理解为 void(*)(int) signal(int, void(*)(int))//但是语法是不支持这样写的return 0;
}
如果你觉得第二个表达式比较复杂,你还可以用 rypedf (类型重命名)来简化代码:
typedef void(*pf_t)(int); //就是将void(*)(int)重新起个名字为pf_t
//不能写成typedef void(*)(int) pf_t ,这样语法不支持
int main()
{void (*signal(int, void(*)(int)))(int);//这个代码就可以简化成下面的代码pf_t signal(int, pf_t);return 0;
}
六.函数指针数组:
函数指针数组本质是数组,只不过数组的元素是函数指针。
int Add(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(*pa)(int, int) = Add;int(*pb)(int, int) = Sub;//这里pa和pb都是函数指针,并且类型都是一样的,我们就可以把它们放在一个函数指针数组里面int(*ptr[4]) = { Add,Sub,Mul,Div };//这就是一个函数指针数组return 0;
}
在函数指针数组使用的时候和数组的使用反式大同小异,都是通过下标引用操作符。
int Add(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(*ptr[4])(int ,int) = {Add,Sub,Mul,Div};printf("请你输入要计算的两个值:>");int i = 0;int x = 0;int y = 0;scanf("%d %d", &x, &y);for (i = 0; i < 4; i++){int ret = ptr[i](x, y);printf("%d\n",ret);}return 0;
}
通过上述的例子我们就可以实现一个可以计算加减乘除的计算器:
int Add(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;
}
void Calc(int(*pa)(int, int))
{int x = 0;int y = 0;printf("请你输入要计算的值:");scanf("%d %d", &x, &y);int ret = pa(x, y);printf("计算的值为%d\n", ret);}
int main()
{int(*ptr[5])(int,int) = {NULL,Add,Sub,Mul,Div};int input = 0;do{printf("请你输入要计算的方法\n");scanf("%d", &input);switch (input){case 0:printf("退出计算\n");break;case 1:Calc(Add);break;case 2:Calc(Sub);break;case 3:Calc(Mul);break;case 4:Calc(Div);break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}
七.指向函数指针数组的指针:
int Add(int x, int y)
{return 0;
}
int main()
{int(*ptr[5])(int, int) = { Add };//这个是函数指针数组int(*(*AAptr)[5])(int, int) = &ptr;//因为*和AAptr先结合,说明AAptr就是一个指针//然后指针又和数组结合,剩下的int(* )(int ,int)就是这个数组的元素的类型:函数指针//所以AAptr就是一个指向函数指针数组的指针变量return 0;
}
八.回调函数
回调函数其实就是一个通过函数指针调用的函数!假如你把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,那么这就是回调机制。
我们来举个例子来理解一下这句话,就像之前的计算器就是一个回调机制。
int A(int x, int y)
{return x + y;
}
void B(int(*ptr)(int, int))
{printf("输入你要计算的两个值:");int x = 0;int y = 0;scanf("%d %d", &x, &y);int ret = ptr(x, y);//通过传过来的指针来访问A函数,这就是回调函数printf("%d\n", ret);
}
int main()
{int(*pa)(int, int) = A;B(A);//把A函数的地址传给B函数return 0;
}
感谢大家的支持,接下来的内容将会是qsort快排,敬请期待。
相关文章:
【C语言进阶】指针进阶
今日所做之事勿候明天,自我所做之事勿候他人。 --歌德 目录 指针进阶(更深层次的理解): 一.字符指针 二.指针数组 三.数组指针 1.数组指针的定义: 2.&数组名和数组名: 3.数组指针的使用: 四.数组参数,指针参数 1.一维数组传参:…...
java:Class的isPrimitive方法使用
java:Class的isPrimitive方法使用 1 前言 java中Class类的isPrimitive方法,用于检查类型是否为基本类型。java虚拟机创建了int、byte、short、long、float、double、boolean、char这8种基础信息,以及void,一共9种。为这9种类型时…...
TCP 握手过程 三次 四次
蛋老师视频 SYN 同步 ACK 确认 FIN 结束 核心机制是确定哪些请求或响应需要丢弃 SYN、ACK、FIN 通过 1/0 设置开启/关闭 开启SYN后,报文中会随机生成 Sequence序号 用于校验 (应用可能发起多个会话,可以区分) 服务器的同步序…...
windows 下 安裝mysql 5.7.41 (64位) 超简单方式
文章目录1. 安装包下载2.安装步骤3. 服务卸载方式4. 配上 my.ini 常用配置1. 安装包下载 注意,截至2023年2月23日,MySQL所有版本不提供ARM芯片架构的Windows版本(8.0.12开始支持Red Hat系统的ARM版本),所以ARM架构的Windows无法安装MySQL&am…...
二叉树——二叉树的最近公共祖先
二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一…...
数据结构与算法基础-学习-14-线性表之串
一、串的定义由0-n个字符组成的有限序列。(n>0)二、串的相关术语1、子串串中任意个连续字符组成的子序列成为该串的子串。2、主串包含子串的串成为主串。3、字符位置字符在序列中的序号为该字符在串中的位置。4、子串位置子串第一个字符在主串中的位置…...
Mac 快捷键
目录 命令行快捷键 命令行快捷键 control d 命令行中代表发送EOF终止输入 control u 删除光标之前到行首的字符 control k 删除光标之前到行尾的字符(比较常用) control a 移动光标到行首(常用) control e 移动光标到行尾 control l 清屏,相当于clear命令 con…...
【微服务】-微服务环境搭建
目录 2.1 技术选型 2.2 模块设计 2.3 微服务调用 2.4 创建⽗⼯程 2.5 创建商品微服务 2.6 创建订单微服务 2.1 技术选型 持久层: SpingData Jpa 数据库: MySQL5.7 其他: SpringCloud Alibaba 技术栈 2.2 模块设计 --- shop-parent ⽗⼯程 --- shop-product-api 商品微服…...
IGKBoard(imx6ull)-ADC编程MQ-2烟雾传感器采样
文章目录1- ADC介绍2- MQ-2烟雾传感器介绍(1)工作原理(2)MQ-2应用电路3- MQ-2烟雾传感器硬件连接4- ADC驱动配置5- 编程查看当前浓度1- ADC介绍 ADC是Analog-to-Digital Converter的缩写,指模数转换器。真实世界的模拟…...
前端二面vue面试题总结
什么是 mixin ? Mixin 使我们能够为 Vue 组件编写可插拔和可重用的功能。如果希望在多个组件之间重用一组组件选项,例如生命周期 hook、 方法等,则可以将其编写为 mixin,并在组件中简单的引用它。然后将 mixin 的内容合并到组件中…...
时间API在更新,传奇已经谢幕,但技术永远不死
(Bill Joy(左一),Vinod Khosla(左二),Andy Bechtolsheim(右二),Scott McNealy(右一) ) CSDN 博文征集活动(和日期相关的代码和bug):点击这里 各位 “big guys”,这篇博文…...
SQL调优指南笔记22:Gathering Diagnostic Data with SQL Test Case Builder
本文为SQL Tuning Guide 第21章“Gathering Diagnostic Data with SQL Test Case Builder”的笔记。 SQL Test Case Builder 是一种工具,可自动收集在不同数据库实例中重现问题所需的信息。 SQL 测试用例是一组信息,使开发人员能够为遇到性能问题的特定…...
从0开始学python -43
Python3 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根…...
Kafka基本原理
总述 简介 Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各…...
css3的重点内容
css3的重点内容 浮动 父级边框塌陷问题 浮动的清除 clear:left; //清除左侧浮动 clear:right; //清除右侧浮动 clear:both; //清除两侧浮动解决方案 增加父级元素的高度增加一个空的div,之后清除浮动通过overflow来进行相关元素的修剪给父类添加相应的伪类元素…...
《Roller: Fast and Efficient Tensor Compilation for Deep Learning》
《Roller: Fast and Efficient Tensor Compilation for Deep Learning》 用于深度学习 快速高效的张量编译器 作者 微软亚洲研究院以及多伦多大学等多所高校 摘要 当前编译为了产生高效的kernel时,搜索空间大,通常使用机器学习的方法 找到最优的方案…...
顺丰同城测试开发一面 49min答案,全文7000字,面试总结都在这里了
今天给大家分享一份顺丰同城的测试开发一面面试真题。老规矩,当你看到这份面试题的时候,先不要着急去看答案,你可以想想假如你在面试现场,你会怎么回答?这个思考的过程其实也是很重要的。 全文7000字干货,…...
docker启动容器服务之后访问失败
关于docker启动容器服务之后,宿主机访问失败(解决方法) 注:在进行docker容器启动宿主机进行容器访问时,无需进行网络的配置,docker容器在启动时会自动解决 第一种原因及修改方法 在进行启动的时候&#…...
GraalVM-云原生时代的JVM(Java)
文章目录一、GraalVM是什么?二、GraalVM有哪些特点?2.1、高性能2.2、多语言支持2.3、互操作性2.4、安全性三、GraalVM的应用效果3.1、提高性能3.2、简化开发3.3、降低成本3.4、节省资源3.5、支持云环境四、使用GraalVM编译springboot应用程序4.1、下载并…...
如何外网登录访问瑞友天翼应用虚拟化系统?——快解析内网端口映射方案
瑞友天翼应用虚拟化系统(GWT System)是国内具有自主知识产权的应用虚拟化平台,是基于服务器计算(Server-based Computing)的应用虚拟化平台。如何将内网平台提供到互联网上外网访问,是我们比较关注的问题。…...
蓝海彤翔执行副总裁张加廷接受【联播苏州】独家专访
今年春节档,科幻类电影《流浪地球2》票房口碑双丰收,截至目前,累计票房已破 38 亿,淘票票评分 9.6 ,影片的特效质感可以媲美国际顶尖水平。其中,蓝海彤翔为影片的后期制作提供了出色的渲染服务。2月21日&am…...
iOS Airplay Screen Mirroring 同屏技术详解
投屏技术已经被大量用在身边的产品,比如电视投屏,投影仪,视频会议产品中。 在iOS平台外的其他平台中都已经有非常成熟的标准和实现。但在封闭的苹果iOS和Mac系统中,苹果使用私有的Airplay协议进行多屏互动,只开放给自己…...
更新 Python 100道基础入门检测练习题【下篇】(附答案)
前言 大家早好、午好、晚好吖 ❤ ~ 爆肝更新 Python 100道基础入门练习题【篇上】 更多精彩内容、资源皆可点击文章下方名片获取此处跳转 实例021:猴子偷桃 题目: 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半…...
[RDMA-高级计算机网络report] Congestion Control for Large-Scale RDMA Departments
本文主要解决的问题是在RoCEv2体系中,基于优先级的拥塞控制PFC是一种粗粒度的机制。 它在端口(或端口加优先级)级别上运行,并且不区分流。PAUSE机制是基于每个端口(和优先级)的,而不是基于每个流…...
ROS2功能包Hello world(python)
文章目录环境准备Python创建工作空间、功能包及节点方法编译使用环境准备 为了便于日后复现,相关环境已经打包到docker中。 拉取docker镜像 docker pull 1224425503/ros2_foxy_full:latest新建容器 docker run -dit --rm --privilegedtrue --network host -e NV…...
数学建模竞赛的一些心得体会
1.数学建模经验首先简要的介绍一下我的情况。数学建模我也是在大一暑假开始接触的,之前对其没有任何的了解。我本身对数学也有相对较厚的兴趣,同时我也是计算机专业的学生,因此,我觉得我可参加数学建模的这个比赛。大一的暑假参加…...
什么是自动化测试?自动化测试现状怎么样?
什么是自动化测试:其实自动化测试,就是让我们写一段程序去测试另一段程序是否正常的过程,自动化测试可以更加省力的替代一部分的手动操作。 现在自动化测试的现状,也是所有学习者关心的,但现在国内公司主要是以功能测…...
CHAPTER 2 Web HA集群部署 - Heartbeat
Web HA集群部署 - Heartbeat1. Heartbeat 概述1.1 Heartbeat主要组成部分2. 环境依赖2.1 环境及组件软件2.2 关闭firewalld & selinux2.3 配置双机互信,SSH密钥登录2.4 同步时间(以主节点时间为准)2.5 配置域名解析3 安装软件3.1 安装…...
蓝桥杯每日一题:不同路径数(dfs深度优先)
给定一个 nm的二维矩阵,其中的每个元素都是一个 [1,9] 之间的正整数。 从矩阵中的任意位置出发,每次可以沿上下左右四个方向前进一步,走过的位置可以重复走。 走了 k 次后,经过的元素会构成一个 (k1) 位数。 请求出一共可以走出…...
NCRE计算机等级考试Python真题(十)
第十套试题1、数据库系统的核心是___________。A.数据库管理系统B.数据模型C.软件工具D.数据库正确答案: A2、下列叙述中正确的是___________。A.线性表链式存储结构的存储空间可以是连续的,也可以是不连续的B.线性表链式存储结构与顺序存储结构的存储空…...
政府英文网站建设外包服务方案/网络营销模式有哪些?
前言对于Qt应用来说,为了更大的跨平台通用性,使用SDL播放音频,同时也能做更多的扩充操作。声波声音是通过空气传播的一种连续的波,简称声波。声音的强弱体现在声波压力的大小上,音调的音调体现在声音的频率上。声音信号…...
做期货的一般看什么网站/湖南省人民政府官网
Pixelmator Pro中文版图像处理软件来啦,让人工智能更好地服务于图片编辑!!你会用它来处理图片吗?新的进化版本Pixelmator Pro Mac 激活版,拥有众多新功能,并且令人工智能在图像处理中发挥了更大的作用。将人…...
网站建设论文框架/新闻软文发稿平台
我们知道定义一个委托之后,就可以像MyDelegate(3,7)这样回调方法,其实每一个委托对象都是一个类对象,每一个委托对象中都有一个Invoke的同步成员方法(查MSDN得知),系统实…...
优化企业网站/百度一下打开
w10设置文件服务器 内容精选换一换华为云弹性文件服务(Scalable File Service)为用户的弹性云服务器(ECS)提供一个完全托管的共享文件存储,符合标准文件协议(NFS)来自:产品cd /home/ior-master/src/home/OpenMPI/bin/mpirun --allow-run-as-root -machin…...
网站做显卡评测软件/google推广平台怎么做
Seems like a lot of my posts lately have started with something like "Heres a weird IE bug" or "Heres something odd in .NET" but... 似乎我最近的许多帖子都是以“这是一个奇怪的IE错误”或“这是.NET中的奇怪内容”开头的,但是... He…...
怎么做国外的网站 卖东西/线上宣传渠道和宣传方式
昨天在网上转了一下,发现SONY已经开放了PSV的SDK(SDK PlayStationSuite SDK)了,目前它还处于测试阶段,正式版的SDK将于2012年下半年发布,正式版的使用费用为99美元/年,开发者需要通过PS商店才能…...