std::vector<std::string> 与 char** 的转换
vecotr 容器中插入多条字符串,再将 vector 的地址转换为 char**
代码如下:
#include <stdio.h> #include <string>
#include <vector> int main() {
std::vector<std::string> url_vector;
url_vector.push_back("www.baidu.com");
url_vector.push_back("www.taobao.com");
url_vector.push_back("www.google.com"); const char** urls = new const char*[url_vector.size() + 1];
for (size_t i = 0; i < url_vector.size(); i++) {
urls[i] = url_vector[i].c_str();
for (size_t j = 0; j < url_vector.size(); j++) {
// 移动 char* 指针
printf("%s\n", urls[j]);
printf("-----------------------分割线-------------1\n");
for (size_t k = 0; k < url_vector[j].size(); k++) {
// 移动 char** 指针
printf("%c", urls[j][k]);
}
printf("\n-----------------------分割线-------------2\n");
} return 0;
}
调试:

分析:
| 0 | w | w | w | . | b | a | i | d | u | . | c | o | m | |
| 1 | w | w | w | . | t | a | o | b | a | o | . | c | o | m |
| 2 | w | w | w | . | g | o | o | g | l | e | . | c | o | m |
char* 指针是解引用字符串的首地址,即 char[0],char[1],char[2] 分别存放的是三个字符串的首地址
char** 指针是解引用字符串中各个字符的地址,比如,char[0][0],char[1][0],char[2][0] 分别放的是三个字符串的首字母
我们可以查看它们所有的地址,
#include <stdio.h> #include <string>
#include <vector> int main() {
std::vector<std::string> url_vector;
url_vector.push_back("www.baidu.com");
url_vector.push_back("www.taobao.com");
url_vector.push_back("www.google.com"); const char** urls = new const char*[url_vector.size() + 1];
for (size_t i = 0; i < url_vector.size(); i++) {
urls[i] = url_vector[i].c_str();
for (size_t j = 0; j < url_vector.size(); j++) {
// 移动 char* 指针
printf("%s\n", urls[j]);
printf("%p\n", urls[j]);
printf("-----------------------分割线-------------1\n");
for (size_t k = 0; k < url_vector[j].size(); k++) {
// 移动 char** 指针
printf("%c", urls[j][k]);
}
printf("\n-----------------------分割线-------------2\n");
for (size_t l = 0; l < url_vector[j].size(); l++) {
printf("%p\n", &urls[j][l]);
}
printf("\n-----------------------分割线-------------3\n");
} return 0;
}
结果:

笔记:
可以看作为一维数组(在内存中存储都是线性一维的)

一维数组 a[i] = *(a+i),同理二维 a[i][j] = *(a[i] + j) = *(*(a + i) + j)
printf("%p\n", urls[i]);
printf("%p\n", &urls[i]);
printf("%p\n", &urls);
打印 urls 的地址,

0x012F6964 存放的是字符串,见上图,
0x12F6820 存放的是 0x012F6964 地址,0xE4FE84 存放的是 0x012F6820 地址,见下图


另附:
How to convert vector<vector<int>>to int**?
std::vector<std::string> 与 char** 的转换的更多相关文章
- 单独删除std::vector <std::vector<string> > 的所有元素
下面为测试代码: 1.创建 std::vector< std::vector<string> > vc2; 2.初始化 std::vector<string> vc ...
- matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量,图片的读入等内容)
MATLAB部分: xmap = repmat( linspace( -regionW/2, regionW/2, regionW), regionH, 1 );%linspace [x1,x2,N] ...
- 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer
1.对于基本数据类型,可以直接使用==和!=进行内容比较 如:int x=30; int y=30; x==y; //true 基本数据类型 简单类型(基本类型) bo ...
- std::vector<std::vector<> >
上次看到这个有点晕了,其实这个vector保存的是std::vector<> #include <vector> #include <iostream> using ...
- string与char* 互相转换以及周边问题
先插一个小知识点 string str = "abc" str += 'd'; cout<<str<<endl; //"abcd" ...
- string、char *的转换
string转char* 主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy(); data()方法 string str = "hello& ...
- std::string,std::vector,std::accumulate注意事项
在用string做字符串拼接时,会发现随着string的增大越来越慢,原因主要是string(和vector)是基于现行内存的数据结构,在海量数据时,经常会申请新的一块内存,把原有的数据拷贝过去然后再 ...
- C++ std::unordered_map使用std::string和char *作key对比
最近在给自己的服务器框架加上统计信息,其中一项就是统计创建的对象数,以及当前还存在的对象数,那么自然以对象名字作key.但写着写着,忽然纠结是用std::string还是const char *作ke ...
- 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)
string.vector 互转 string 转 vector vector vcBuf;string stBuf("Hello DaMao!!!");----- ...
- (原创)动态内存管理练习 C++ std::vector<int> 模拟实现
今天看了primer C++的 “动态内存管理类”章节,里面的例子是模拟实现std::vector<std::string>的功能. 照抄之后发现编译不通过,有个库函数调用错误,就参考着自 ...
随机推荐
- [转帖]Oracle数据库开启NUMA支持
NUMA简介 NUMA(Non Uniform Memory Access Architecture,非统一内存访问)把一台计算机分成多个节点(node),每个节点内部拥有多个CPU,节点内部使用共有 ...
- [转帖]5. Tikv安装部署
5. Tikv安装部署 5.1. 概述 TiDB 是 PingCAP 公司自主设计.研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactiona ...
- [转帖]文件操作之zip、bzip2、gzip、tar命令
文件操作之zip.bzip2.gzip.tar命令 原创 丁同学19902015-10-15 00:02:51博主文章分类:liunx基础著作权 文章标签linux tarlinux文件压缩linux ...
- [转帖]nginx 反向代理中proxy_set_header的含义
https://www.jianshu.com/p/cd813d68ed25 0.1212020.10.23 09:29:53字数 284阅读 9,939 1.proxy_set_header设置的请 ...
- 给无网络的CentOS服务器下载rpm包的一个解决办法
很多公司的服务器为了安全都在内网, 是无法直接连接互联网的, 无法连接互联网就无法使用yum等的包管理器安装rpm包等. 有时候一些rpm包还是能很好的提高性能的, 所以可以使用多种方式获取rpm包进 ...
- DBeaver连接国产信创数据库的步骤
DBeaver连接国产信创数据库的步骤 本次连接使用的数据库类型 1.达梦 2.神通 3.人大金仓 4.瀚高 安装DBeaver 通过官网或者是其他网站下载最新的数据库介质 之后的操作为: 这次不感谢 ...
- zabbix 6.0 官方文档
Choose your platform ZABBIX VERSION 6.0 LTS 5.4 5.0 LTS 4.0 LTS OS DISTRIBUTION Red Hat Enterprise ...
- gRPC如何保障数据安全传输
什么是 gRPC? gRPC 是由 Google 开发的高性能.开源的 RPC(Remote Procedure Call)框架,用于在客户端和服务器之间进行通信.它基于 Protocol Buffe ...
- Postman 简单使用随笔记
1.要先使用Postman post请求,返回token,否则提示未登陆系统,下图为发送请求后的接口返回的信息 2.为方便,每次在访问接口时都要访问权限,所以将其作为局部的环境变量,设置如下: 3.要 ...
- C/C++ 实现Socket交互式服务端
在 Windows 操作系统中,原生提供了强大的网络编程支持,允许开发者使用 Socket API 进行网络通信,通过 Socket API,开发者可以创建.连接.发送和接收数据,实现网络通信.本文将 ...