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();
} // print
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();
} // print
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** 的转换的更多相关文章

  1. 单独删除std::vector <std::vector<string> > 的所有元素

    下面为测试代码: 1.创建 std::vector< std::vector<string> > vc2; 2.初始化 std::vector<string> vc ...

  2. matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量,图片的读入等内容)

    MATLAB部分: xmap = repmat( linspace( -regionW/2, regionW/2, regionW), regionH, 1 );%linspace [x1,x2,N] ...

  3. 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer

    1.对于基本数据类型,可以直接使用==和!=进行内容比较 如:int x=30;        int y=30;         x==y;  //true 基本数据类型 简单类型(基本类型) bo ...

  4. std::vector<std::vector<> >

    上次看到这个有点晕了,其实这个vector保存的是std::vector<> #include <vector> #include <iostream> using ...

  5. string与char* 互相转换以及周边问题

    先插一个小知识点 string str = "abc" str += 'd'; cout<<str<<endl;  //"abcd"   ...

  6. string、char *的转换

    string转char* 主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy(); data()方法 string str = "hello& ...

  7. std::string,std::vector,std::accumulate注意事项

    在用string做字符串拼接时,会发现随着string的增大越来越慢,原因主要是string(和vector)是基于现行内存的数据结构,在海量数据时,经常会申请新的一块内存,把原有的数据拷贝过去然后再 ...

  8. C++ std::unordered_map使用std::string和char *作key对比

    最近在给自己的服务器框架加上统计信息,其中一项就是统计创建的对象数,以及当前还存在的对象数,那么自然以对象名字作key.但写着写着,忽然纠结是用std::string还是const char *作ke ...

  9. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  10. (原创)动态内存管理练习 C++ std::vector<int> 模拟实现

    今天看了primer C++的 “动态内存管理类”章节,里面的例子是模拟实现std::vector<std::string>的功能. 照抄之后发现编译不通过,有个库函数调用错误,就参考着自 ...

随机推荐

  1. [转帖]Oracle数据库开启NUMA支持

    NUMA简介 NUMA(Non Uniform Memory Access Architecture,非统一内存访问)把一台计算机分成多个节点(node),每个节点内部拥有多个CPU,节点内部使用共有 ...

  2. [转帖]5. Tikv安装部署

    5. Tikv安装部署 5.1. 概述 TiDB 是 PingCAP 公司自主设计.研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactiona ...

  3. [转帖]文件操作之zip、bzip2、gzip、tar命令

    文件操作之zip.bzip2.gzip.tar命令 原创 丁同学19902015-10-15 00:02:51博主文章分类:liunx基础著作权 文章标签linux tarlinux文件压缩linux ...

  4. [转帖]nginx 反向代理中proxy_set_header的含义

    https://www.jianshu.com/p/cd813d68ed25 0.1212020.10.23 09:29:53字数 284阅读 9,939 1.proxy_set_header设置的请 ...

  5. 给无网络的CentOS服务器下载rpm包的一个解决办法

    很多公司的服务器为了安全都在内网, 是无法直接连接互联网的, 无法连接互联网就无法使用yum等的包管理器安装rpm包等. 有时候一些rpm包还是能很好的提高性能的, 所以可以使用多种方式获取rpm包进 ...

  6. DBeaver连接国产信创数据库的步骤

    DBeaver连接国产信创数据库的步骤 本次连接使用的数据库类型 1.达梦 2.神通 3.人大金仓 4.瀚高 安装DBeaver 通过官网或者是其他网站下载最新的数据库介质 之后的操作为: 这次不感谢 ...

  7. zabbix 6.0 官方文档

    Choose your platform   ZABBIX VERSION 6.0 LTS 5.4 5.0 LTS 4.0 LTS OS DISTRIBUTION Red Hat Enterprise ...

  8. gRPC如何保障数据安全传输

    什么是 gRPC? gRPC 是由 Google 开发的高性能.开源的 RPC(Remote Procedure Call)框架,用于在客户端和服务器之间进行通信.它基于 Protocol Buffe ...

  9. Postman 简单使用随笔记

    1.要先使用Postman post请求,返回token,否则提示未登陆系统,下图为发送请求后的接口返回的信息 2.为方便,每次在访问接口时都要访问权限,所以将其作为局部的环境变量,设置如下: 3.要 ...

  10. C/C++ 实现Socket交互式服务端

    在 Windows 操作系统中,原生提供了强大的网络编程支持,允许开发者使用 Socket API 进行网络通信,通过 Socket API,开发者可以创建.连接.发送和接收数据,实现网络通信.本文将 ...