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>的功能. 照抄之后发现编译不通过,有个库函数调用错误,就参考着自 ...
随机推荐
- [转帖]time_zone 是怎么打爆你的MySQL的
https://plantegg.github.io/2023/10/03/time_zone%E6%98%AF%E6%80%8E%E4%B9%88%E6%89%93%E7%88%86%E4%BD%A ...
- [转帖]How fast are Unix domain sockets?
https://blog.myhro.info/2017/01/how-fast-are-unix-domain-sockets Jan 3, 2017 • Tiago Ilieve Warning: ...
- [转帖]s3fs
https://github.com/s3fs-fuse/s3fs-fuse s3fs allows Linux, macOS, and FreeBSD to mount an S3 bucket v ...
- [转帖]enq: TX - row lock contention故障处理一则
https://www.cnblogs.com/zhchoutai/p/7088826.html 一个非常easy的问题,之所以让我对这个问题进行总结.一是由于没我想象的简单,在处理的过程中遇到了 ...
- [转帖]dd命令中dsync和fsync区别
在Linux系统中经常会使用dd命令来测试硬盘的写入速度,命令会涉及几个常用参数:sync.dsync.fsync与fdatasync # dd if=/dev/zero of=/tmp/1G bs= ...
- Java进程 OOM的多种情况
Java进程 OOM的多种情况 摘要 OOM 其实有多种: 第一类是JVM原生自发处理的, 这种也分为多种情况. 1. 堆区使用了比较多,并且大部分对象都还有引用, GC不出来可用内存, 这是要给对象 ...
- 在线获取所有依赖rpm包的方法
背景 现在经常有一些不能上网的LInux机器但是需要安装一些软件. 但是有时候经常因为有依赖关系找不到的情况比较麻烦. 或者是一些公司的网络总是受限,网络速度非常慢. 下载安装非常折磨人. 这个时候就 ...
- 感受 Vue3 的魔法力量
作者:京东科技 牛至伟 近半年有幸参与了一个创新项目,由于没有任何历史包袱,所以选择了Vue3技术栈,总体来说感受如下: • setup语法糖<script setup lang=" ...
- vue3自定义指令(防抖指令)与vue3与vue2指令的对比
定义指令的变化 根据vue3文档的描述 https://v3.cn.vuejs.org/guide/migration/introduction.html#%E6%B8%B2%E6%9F%93%E5% ...
- Jupyter Notebook支持Go
在执行下列命令之前,请确保你已经安装了Go和Jupyter. gophernotes是针对Jupyter和nteract的Go内核,它可以让你在基于浏览器的笔记本或桌面app上交互式地使用Go.下面介 ...