【数组及指针经典笔试题解析】
1.数组和指针笔试题
题目1
int main(){int a[5] = { 1,2,3,4,5};int * ptr = (int * )(&a + 1);printf("%d,%d",*(a + 1),*(ptr - 1));return 0;}
图文解析:
int * ptr = (int * )(&a + 1);
✍️.&a
——表示的是整个数组的地址,而在内存存储中,整个数组的地址其实是在首元素地址的前一个空间位置,所以&a
所展示的位置如上图所示。
✍️.&a+1
——在很多的数据类型中,+1表示的是加多少字节,字节数取决于类型数,而&a+1
中的&a
表示的是数组的地址,那么这就表示了加一个&a
一样大小的字节数,然后抵达的地址。
✍️.而这个地址也如图整个数组地址一样,处在下一个数组之前的空间位置,或者处在这个数组空间之后的一个空间位置。
✍️.(int*)
——&a+1
表示的是数组的地址,而(int*)
是进行强制类型转化,转化为int
类型的指针地址
*(ptr - 1)
✍️.如图,结合上一步的分析,&a+1
被强制类型转化为了int*
类型的并赋予了同样类型的ptr
✍️.ptr
的内部存放的是&a+1
的地址,但是整个地址被转化为了int*
类型
✍️.进行ptr-1
后,这个-1的操作从数组数据类型变为了int
类型的,因此-1减去的是四个字节,在int
类型的数组中,四个字节表示一个元素,因此ptr-1
便是如图中所示,移动到了数组的最后一个元素。
✍️.所以*(ptr-1)
得到的结果是数组的最后一个元素 5
*(a + 1)
✍️.a
——数组名,因为并不是在sizeof
中,所以该处的a表示的是首元素的地址
✍️.a+1
——在很多的数据类型中,+1表示的是加字节数,而加上的字节数取决于数据的类型,眼下的a表示的是首元素的地址,而首元素表示的是int
类型,也因此+1表示的是加四个字节,也就从首元素地址变成了第二个元素的地址
✍️.*(a+1)
——表示的就是第二个元素地址指向的元素,也就是第二个元素 2
结论:
1.&a+1 —— &a 表示的是数组的地址,+1加的是这个数组的总字节数大小后,抵达的位置。
2.a+1 ——a表示的是首元素的地址,+1加的是同这个元素一样的字节数大小后,抵达的位置。
3.加上的字节大小,看数组的数据类型或者元素的数据类型。
题目2
int main() { int a[3][2] = { (0, 1), (2, 3), (4, 5) }; int *p; p = a[0]; printf( "%d", p[0]); return 0; }
图文解析:
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
✍️.{ (0, 1), (2, 3), (4, 5) }内部并不是花括号括起来的,因此是逗号表达式!实际上{ }内只有三个元素。
✍️.int a[3][2] = { (0, 1), (2, 3), (4, 5) };
实际上是int a[3][2] = { 1,3,5 };
而其余的未满的元素全是0
✍️.所以,这个三行两列的矩阵应该是 第一行是 1 3 第二行是 5 0 第三行是0 0
p = a[0];
✍️.a[0]
表达的是二维数组第一行的数组名,既然是数组名又不在sizeof
内,那代表的就是首元素的地址,那就是a[0][0]
的地址,也就是元素 1
p[0]
✍️.p[0]
其实就是*(p+0)
也就表示 元素 1
✍️.因为p = a[0] ;
a[0]
相当于数组名,而数组名[ ]的组合相当于是取数组中的某个元素的意思,所以p[0]
相当于a[0] [0]
其中的a[0]
是数组名,所以取的是a[0]
这个数组中下标位0的元素,a[0]
表示的是第一行,所以取的是第一行中下标为0的元素。
题目3
int main() { int a[5][5]; int(*p)[4]; p = a; printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0; }
图文解析:
int(*p)[4];
✍️.定义了指针变量p是一个数组指针,且该数组指针指向的数组内具有四个元素。
✍️.当进行p+1
的时候,加上的就是四个元素的字节大小之和。
p = a;
✍️.a
表示的是数组名,二维数组的数组名表示的是二维数组的第一行的地址,由于地址的特性,是处在数组元素之前的内存空间内。
✍️.所以如上图所示
&p[4][2] - &a[4][2];
✍️.因为p
是一个int
类型的指针数组,指针数组的跨度是4个元素,而p[4][2]
相当于一个二维数组,取的是第四行下标为2的元素。
✍️.&a[4][2]
取的就是a
数组中第四行下标为2的元素的地址
✍️.&p[4][2]
表示的就是p+4
这一个跨度中,下标为2的元素地址和&a[4][2]
相减,得到的是-4。
题目4
int main() { int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int *ptr1 = (int *)(&aa + 1);int *ptr2 = (int *)(*(aa + 1));printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;}
图文解析:
int *ptr1 = (int *)(&aa + 1);
✍️.&aa
表示整个数组的地址,&aa+1
表示越过了一个数组大小的地址位置,整个数组的地址在首元素地址之前的内存空间中,因此如上图所示。
✍️.(int*)
是强制类型转化,将其转化为int
类型的指针。
int *ptr2 = (int *)(*(aa + 1));
✍️.aa
相当于首元素地址,在二维数组中首元素地址就是第一行的地址,而aa+1
表示的就是第二行地址
✍️.且aa+1
又可以转化为aa[1]
表示数组名,表示的是第二行的数组名,那么可以表示第二行第一个元素的地址而就表示第二行第一个元素,此处的int强制类型转化是没有用的。
*(ptr1 - 1), *(ptr2 - 1)
*(ptr1 - 1)
✍️.*(ptr1-1)
ptr
因为是int
类型的指针,且被传输了&aa+1
的地址,那么ptr-1
根据数据类型-1就是减去四个字节,所以根据上图所示,我们得知ptr-1
就是指向整个数组的最后一个元素。
✍️.*(ptr-1)
就是最后一个元素 10
*(ptr2 - 1)
✍️,ptr2-1
就是第二行第一个元素减一,就是第一行最后一个元素,所以表示的就是元素5
结论:
在二维数组中,数组名+1 = 数组名[1] 即表示第二行的地址又表示了第二行第一个元素的地址。
题目5
int main(){char *a[] = {"work","at","alibaba"};char**pa = a;pa++; printf("%s\n", *pa);return 0; }
图文解析:
char *a[] = {"work","at","alibaba"};
✍️.字符指针类型的数组,字符串传递地址时,是传递的首字符的地址。
char**pa = a;
✍️.a是数组名,数组名就是首元素的地址,所以pa指向的就是首元素的地址,如上图所示。
pa++;
✍️.pa++指向的是第二个元素的地址。
printf("%s\n", *pa);
✍️.经历了pa++
后,pa指向的是字符指针数组的第二个元素,而在第二个元素中寄存的是字符串at
的首字符地址,所以*pa
也就是表示的是at
的首字符a
,但由于printf
打印的是%s格式,%s
是字符串格式,所以打印的是字符串at
题目6
int main() { char *c[] = {"ENTER","NEW","POINT","FIRST"};char**cp[] = {c+3,c+2,c+1,c};char***cpp = cp;printf("%s\n", **++cpp);printf("%s\n", *--*++cpp+3);printf("%s\n", *cpp[-2]+3);printf("%s\n", cpp[-1][-1]+1);return 0; }
图文解析:
char *c[] = {"ENTER","NEW","POINT","FIRST"};
✍️.创建了一个字符指针数组,指针数组的内部存储的是各个字符串的首个字符的地址。
char**cp[] = {c+3,c+2,c+1,c};
✍️.cp
是一个二级指针数组,数组的内部存储的是字符指针数组c
的某些地址。
✍️.c+3
——其中c
是指针数组c的数组名,表示的是数组中首元素的地址,也便是c[0]
的地址,而c+3
表示的是往后加上三个元素的地址后抵达的位置,可以当作c[3]
的地址。
✍️.c+2
——同理,表示c[2]
代表的元素地址
✍️.c+1
——表示的是c[1]
代表的元素地址
✍️.c
——表示的是首元素地址
char***cpp = cp;
✍️.cpp
是三级指针,cpp
内存储的是cp
的首元素地址。
printf("%s\n", **++cpp);
✍️.++
使得cpp
发生改变,原先的cpp内存储的是cp
的首元素地址,在++
后因为是指针数组,++
表示的是向后加一个元素大小的地址,也就是第二个元素的地址。
✍️.因此在++
后,这里的cpp
存储的是cp1
的第二个元素,c+2
。
✍️.于是乎就变成了**(c+2)
,先解决第一个*
,c+2
在cp
内,cp
也是一个指针,所以c+2
指向的是c中的第三个元素,POINT
的首字符P
的地址
✍️.于是乎就变成了*
(P
的首字符地址)
✍️.最后在解除最后一个*
,且因为打印的格式是%s
,所以打印除的结果是POINT
printf("%s\n", *--*++cpp+3);
✍️.按照优先级,先进行++cpp
运算,因为++
是有累计性的,所以cpp
此刻存储的是cp
中第二个元素的地址,如上图所示,因此在进行++
后,cpp
指向(存储)的地址变成了cp的第三个元素地址,也就是c+1的地址,所以变成了*--*(&cp[2])+3
✍️.(&cp[2])
表示的是cp
中第三个元素的地址,最后通过*
得到了内部存储的元素c+1
,所以现在的结果是*--(c+1)+3
✍️.*--(c+1)+3
,在进行--
,将c+1
进行--
得到的结果是c
,于是变成了*(c)+3
✍️.c
指向的内容是字符串ENTER
的首字符E
的地址,所以在*
后得到的是'E'+3
✍️.'E'+3
的E
是字符类型,+3
,相当于是加了三个字符类型的字节数大小,于是结果变成了ENTER
中的第二个E
✍️.最后打印的格式是%s
,所以打印的结果是ER
printf("%s\n", *cpp[-2]+3);
✍️.由于++
是有累积性的,所以cpp
中存储的地址是cp
的第三个元素的地址
✍️.cpp[-2]
,表示的是一个元素,根据*(数组名+ 0) =数组名[0]
,数组名[0]也表示一个元素 ,而数组名又表示首元素地址,我们得到结论,*(数组名+0)=数组名[0] =*( 首元素地址 +0)
✍️.而cpp
是存储地址的指针,因此cpp[-2]
我们可以得到,cpp
现在所指向的地址-2之后得到的元素。
✍️.cpp
当前的地址是经过了上一次的++
累加后,变成了如上图所示,指向的是cp
的第三个元素,所以在-2后得到的结果是指向了cp
的第一个元素,而第一个元素的内容是c+3
✍️.所以cpp[-2]= c+3
✍️.*cpp[-2]+3 ————> *(c+3)+3
✍️.c
是一个数组名,表示的是数组首元素地址,而c+3
根据数组名+n = &数组名[n]
的原理,我们得到了c+3
是表示首元素地址+3个元素的字节大小后后抵达的地址
✍️.在c
中下标为3的元素是字符串FIRS
的首字符地址,所以c+3
表示的就是字符F
的地址
✍️.随后得到*(c+3)+3————>'F'+3
✍️.因为F
是字符,且+3相当于是加上三个相同类型的字节数,又因为打印的各式是%s
,所以得到的结果是ST
printf("%s\n", cpp[-1][-1]+1);
✍️.cpp
内存储的依旧是cp
中第三个元素的地址
✍️.cpp[-1][-1]
并不是二维数组所表达的意思,根据数组名[n] = *(数组名+n)
的原理,进行计算,可以先将cpp[-1]
当作数组名,那么我们可以转化为*(cpp[-1] +(-1))
✍️.而后,又将cpp
当作数组名进行运算,那么我们可以转化为*(*(cpp+(-1))+(-1))——>*(*(cpp-1)-1)
✍️.而cpp
中存储的是cp
中第三个元素的地址,在进行-1后cpp
中存储的地址发生了改变,变成了cp
中第二个元素的地址,也就是c+2
整个元素所在的地址,而通过第一个*后得到的结果就是c+2
✍️.所以式子变成了*(c+2-1)
✍️.内部运算,得到的结果是*(c+1)
✍️.最后整个式子是*(c+1)+1
,而c
是数组名,表示的是数组c
的首元素地址,于是c+1
表示的就是第二个元素的地址,在通过*
得到的就是数组c
的第二个元素
✍️.数组c
的第二个元素是字符串NEW
的首字符地址,所以最后的+1就是首字符地址加一,通过同类型原理,得到的就是第二个字符的地址
✍️.又因为打印的方式是%s
所以最后的结果是EW
结论:
✍️.*(数组名+ 0) =数组名[0]
,这里的数组名表示的是首元素地址
✍️.数组名[n]
表示的是在这个数组中,下标为n的元素的地址,也可以说为&数组名[n]
✍️.数组名[n][n]
这个数组并不是二维数组时,可以得到数组名[n][n]= *(*(数组名+n)+n)
相关文章:
【数组及指针经典笔试题解析】
1.数组和指针笔试题 题目1 int main(){int a[5] { 1,2,3,4,5};int * ptr (int * )(&a 1);printf("%d,%d",*(a 1),*(ptr - 1));return 0;}图文解析: int * ptr …...
Transformer学习-self-attention
这里写自定义目录标题 Self-attentionMulti-head self-attention用self-attention解决其他问题 Self-attention 用Wq、Wk、Wv分别乘输入向量得到q、k、v向量 用每个q向量乘所有的k向量得到对应项的attention,即用每项的query向量去匹配所有的key向量,得…...
Spring Boot:利用JPA进行数据库的增改
目录 JPA介绍Service接口Service和Autowired示例代码 Dao数据库操作层Repository示例代码 控制器文件示例代码-增加增加成功示例代码-修改修改成功 JPA介绍 JPA(Javaa Persistence API)一种用于持久化 Java 对象到关系型数据库的标准规范。它提供了一种统一的方式来…...
列表的增删改查和遍历
任务概念 什么是任务 任务是一个参数为指针,无法返回的函数,函数体为死循环不能返回任务的实现过程 每个任务是独立的,需要为任务分别分配栈称为任务栈,通常是预定义的全局数组,也可以是动态分配的一段内存空间&#…...
获取网卡上的IP、网关及DNS信息,获取最佳路由,遍历路由表中的条目(附源码)
VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...&a…...
保姆级 -- Zookeeper超详解
1. Zookeeper 是什么(了解) Zookeeper 是一个 分布式协调服务 的开源框架, 主要用来解决分布式集群中应用系统的一致性问题, 例如怎样避免同时操作同一数据造成脏读的问题. ZooKeeper 本质上是 一个分布式的小文件存储系统 . 提供基于类似于文件系统的目录树方式的数据存储, …...
【通意千问】大模型GitHub开源工程学习笔记(2)--使用Qwen进行推理的示例代码解析,及transformers的库使用
使用Transformers来使用模型 如希望使用Qwen-chat进行推理,所需要写的只是如下所示的数行代码。请确保你使用的是最新代码,并指定正确的模型名称和路径,如Qwen/Qwen-7B-Chat和Qwen/Qwen-14B-Chat 这里给出了一段代码 from transformers import AutoModelForCausalLM, Aut…...
从0开始python学习-23.selenium 常见鼠标的操作
注意:必须创建一个事件链对象(ActionChains);最后鼠标事件链完成之后一定要进行事务提交perform()(如果事件链不提交那么所有的鼠标事件都不会执行) 1. 左键单击:click()…...
电气基础——电源、变压器、接触器、断路器、线缆
目录 1.电源 2.变压器 三项电和2相电的转换 3.接触器 4.断路器 5.线缆 1.电源 2.变压器 三项电和2相电的转换 三相电转为2相电 1.变压器 2.相位移转换器 3.电容器 两相电变不了三相电。但是两相电可以通过电容移相后带动三相电机 零线,地线Nÿ…...
步力宝科技爆款产品定位,开创智能物联网新商业
数据显示,中国处于 “亚健康”状态人口数量约占总人口的70%,亚健康是一种临界状态,指介于健康和疾病之间的状态。亚健康是一个动态演变的过程,既有向慢病发展的趋势,也能通过合理的干预使人体重返健康状态,…...
凉鞋的 Unity 笔记 105. 第一个通识:编辑-测试 循环
105. 第一个通识:编辑-测试 循环 在这一篇,我们简单聊聊此教程中所涉及的一个非常重要的概念:循环。 我们在做任何事情都离不开某种循环,比如每天的 24 小时循环,一日三餐循环,清醒-睡觉循环。 在学习一…...
Bug:elementUI样式不起作用、Vue引入组件报错not found等(Vue+ElementUI问题汇总)
前端问题合集:VueElementUI 1. Vue引用Element-UI时,组件无效果解决方案 前提: 已经安装好elementUI依赖 //安装依赖 npm install element-ui //main.js中导入依赖并在全局中使用 import ElementUI from element-ui Vue.use(ElementUI)如果此…...
【大麦小米学量化】使用文心一言AI编写股票量化交易策略代码(含演示代码和进阶演示)
文章目录 AI是个宝前言一、文心一言是什么?二、让AI根据策略写出代码1. 策略提示词2. AI给出的策略代码及说明 三、进阶调试总结 AI是个宝 小米听说百度开放了文心一言AI,好奇的跑去问大麦:“文心一言都放开了,什么代码都可以写&a…...
软考 系统架构设计师系列知识点之软件架构风格(1)
这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格(水平)考试,11月4号就要考试,因此8天长假绝不能荒废,必须要好好利用起来。现在将各个核心知识点一一进行提炼并做记录。 所…...
轮询与中断
中断控制器 #include"exynos_4412.h"int main() {/*产生一个中断信号*//*1.属于外设层次,让外部的硬件控制器能产生一个中断信号并发送给中断控制器*//*将GPX1_1设置成中断功能*/GPX1.CON GPX1.CON |( 0xF << 4);/*设置GPX1_1中断的触发方式---下降…...
使用docker完成minio服务部署扩容备份迁移生产实践文档
一、minio服务扩容方案 当服务器存储空间不足的时候,需要进行扩容,扩容过程中需要短暂停机时间,预计在一小时内能够完成和恢复 统一注意事项 强烈建议为部署中的所有节点选择基本相似的硬件配置。确保硬件(CPU、内存、主板、存…...
管道-有名管道
一、有名管道 有名管道与匿名管道的不同: 有名管道提供了一个路径名,并以FIFO的文件形式存在于文件系统中。与匿名管道不同,有名管道可以被不相关的进程使用,只要它们可以访问该路径,就能够通过有名管道进行通信。 FI…...
谷歌注册手机号码无法验证
1. 打开设置,在语言中点击添加语言搜索English并添加 2. 点击添加后把首选语言换成英语 3. 然后重启浏览器,这时候浏览器就是英文了,最后打开注册页面就能接收短信了...
C语言编译与链接过程详解
C语言编译与链接过程详解 源文件 main.c #include <stdio.h>extern int data; extern int add(int a,int b);int a1; int a2 0; int a3 10;static int b1; static int b2 0; static int b3 20;int main() {int c1;int c2 0;int c3 30;static int d1;static int …...
Qt信号和槽 定时器
文章目录 1 信号和槽1.1 信号和槽的概念1.2 信号和槽的应用1.3 信号和槽的连接1.4 信号和槽的特性1.5 生活中的类似例子1.6 信号和槽的优势 2 信号和槽的使用2.1 控件的信号和槽2.2 自定义信号和槽2.3 信号和槽的参数传递 3 定时器3.1 QTimer类的基本使用3.2 QTimer类的成员函数…...
zemax对称式目镜
两个几乎对称的双胶合透镜相对放置,可以达到25度的半视场 为了加工方便,这两个透镜组采用相同的结构 对称式目镜要求各组透镜自行校正色差,这样倍率色差也随之而校正。 它还能校正两种像差,慧差和象散。 对称目镜的结构更紧&…...
层次架构、面向服务架构(四十四)
层次架构设计 表现层、中间层、数据访问层、数据架构规划、物联网层次架构、层次式架构案例分析。 层次结构缺点就是效率问题,上一层调用下一层。 1、着重写中间层 组件设计:面向接口编程,分为接口和实现类。 实体设计:实体表…...
Ubuntu22无法自动进入lightdm图像界面
问题:Ubuntu22无法自动进入lightdm图像界面,必须手动运行 lightdm start解决方案: 方案一: 运行一个终端输入 cat /etc/X11/default-display-manager /etc/init/lightdm.conf不接受lightdm作为设置,但是,/…...
01BFS最短距离的原理和C++实现
时间复杂度 O(n),n是边数。 使用前提 边的权只有两种:0,1。 典型场景 n个端点的无向图,编号范围[0,n)。Edges0表示{{n1,n2},...{n3,n4}}表示n1和n2,n3和n4之间有路联接。Edges1表示{{n1,n2},...{n3,n4}}表示n1和n2,n3和n4之间…...
【洛谷 P5266】【深基17.例6】学籍管理 题解(映射+分支)
【深基17.例6】学籍管理 题目描述 您要设计一个学籍管理系统,最开始学籍数据是空的,然后该系统能够支持下面的操作(不超过 1 0 5 10^5 105 条): 插入与修改,格式1 NAME SCORE:在系统中插入姓…...
10.03
代码 #include <iostream>using namespace std; class cz { private:int num1; //实部int num2; //虚部 public:cz(){}cz(int a,int b):num1(a),num2(b){}cz(const cz &other):num1(other.num1),num2(other.num2){}~cz(){}const cz operator(const cz &othe…...
链表单向链表跳跃链表
单向链表 link list t数组的局限:编译期就需要知道大小; 内存连续,插入困难 // 链表节点类 包含一个信息 和指向下一个 节点的指针clas IntLLNode{public:IntLLNode(){// 默认构造函数 没有info信息nextPtr_ 0;// 空指针}IntLLNode(int …...
博客无限滚动加载(html、css、js)实现
介绍 这是一个简单实现了类似博客瀑布流加载功能的页面,使用html、css、js实现。简单易懂,值得学习借鉴。👍 演示地址:https://i_dog.gitee.io/easy-web-projects/infinite_scroll_blog/index.html 代码 index.html <!DOCT…...
腾讯云南京服务器性能如何?南京服务器测速IP地址
腾讯云服务器南京地域怎么样?南京地域很不错,正好处于中间的位置,南方北方用户均可以选择,网络延迟更低速度更快,并且目前南京地域有活动,南京地域可用区可选南京一区、南京二区和南京三区,腾讯…...
MySQL和Oracle中,语法的不同点以及如何在xml中书写日期比较大小
众所周知mysql和oracle的语法有点相识,又有点不同。 在MySQL和Oracle中,语法的不同点有以下几个方面: 数据类型:MySQL和Oracle支持的数据类型有所不同,比如MySQL支持的数据类型包括:整型、浮点型、字符型、…...
网站建设的基本要素/非国产手机浏览器
一、基本介绍 Git是一个文件版本管理工具,可以较为方便的进行文件管理,其为分布式的版本管理和同步软件 git只用于维护本地仓库,git也可以与远程代码托管中心进行联动,将本地仓库和远程仓库进行同步,远程仓库可以是Git…...
网站建设与管理教案/产品推广方案ppt模板
程序猿和架构师都应该了解“康威定律”(Conways law) 什么是康威定律 康威定律是一句格言,指出组织设计系统来反映他们自己的沟通结构。它以计算机程序员梅尔文康威的名字命名,他于1967年提出了这个想法。他最初的措辞是: organizations wh…...
便宜做外贸网站/深圳海外推广
第6周 文章目录第6周[toc] 十、应用机器学习的建议(Advice for Applying Machine Learning)10.1 决定下一步做什么10.2 评估一个假设10.3 模型选择和交叉验证集10.4 诊断偏差和方差10.5 正则化和偏差/方差10.6 学习曲线10.7 决定下一步做什么十一、机器学习系统的设计(Machine …...
Dell网站建设建议/简述什么是网络营销
在js中,数组是特殊的对象,凡是对象有的性质,数组都有,数组表示有序数据的集合,而对象表示无序数据的集合。 那伪数组是什么呢,当然它也是对象,伪数组一般具有以下特点: 按索引方式存…...
网站如何做自适应/seo软件工具箱
ER Master 数据库设计工具 ER Master 是一个用于设计ER模型图的Eclipse插件。提供的功能包括:从数据库导入关系生成ER图,导出设计图,导出DDL数据定义语句等。目前完整支持的数据库包括 MySQL、PostgreSQL 和-Oracle (developing)-DB2 (develo…...
外贸网站好做吗/网络推广是什么工作内容
介绍 此款源码是彻底解放劳动人民的双手,全自动采集,模板代码也进行了全面优化,更加有助于SEO 下载链接 http://www.bytepan.com/iTHwNKE6vZD 图片...