C++指针笔记

const & const与指针

1. const自己的一些规则

  • const修饰变量时,定义时就要初始化

    • const int a=5;
      
  • 相当常用的情况: 限定函数的形参 — 这样函数就不会修改实参指针所指向的数据。

    • int func (const char *ptr)
      {
         //略 
      }
      

2. const与指针

2.1 指向const的指针

  • 一个指向const类型的指针

    • 首先是一个指针;
    • 其次指向的内容是const 类型,比如const int
    • 即: 指向的内容不可修改。指针可以随便指,但是指的地方不能修改。
    const int *p;
    

    ​ 也可以写成:

    int const *p;
    

2.2 const 指针

  • 一个const的指针

    • 首先,还是一个指针
    • 其次,这个指针自个儿是const类型的
    • 即:不能随便指,初始化指定哪个地址了就是哪个地址了(所以必须初始化),但是地址里的内容可以变。
    int* const p=某地址;
    *p=10; //指针的内容可以变
    

2.3 指向const的const指针

  • 一个指向const类型的const指针
  • 即,既不能随便指,也不能随便改变指的内容;又即,地址和内容都不能变。
const int* const p= 某地址;
//或者:
int const * const p=某地址;

3. 常见相关面试题

  • 问:const char *p,char const *p,char * const p的区别
    • const char *p: 指向的是const char类型,指针可以变,但是不能通过指针修改char中的内容(因为char前面有个const
    • char const *p: 和const char* p一样;没有所谓const*的运算
    • char* const p: 指针地址是固定的,必须初始化,可以用指针改变指向的内容
char str[100]="Hello World";
	//const char *p=str; // 如果指向const char了
	//char const *p=str;
	char *const p=str; //必须初始化
	//p[0]='X'; // 如果指向const char,就不能通过指针改变内容
	p=&str[1]; //const指针不能随便指
	printf("%s\n",p);

4. 参考链接

  1. https://www.cnblogs.com/qxj511/p/4965793.html

  2. https://blog.csdn.net/m0_37806112/article/details/81252151?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2

stl::vector<>转数组

转自:http://www.cnblogs.com/loongfee/archive/2012/05/05/2484574.html

std::vector很方便,但有时调用的函数的参数规定是数组,需要将vector转为数组,另外开辟一个空间,将vector一项项复制过去代价过大,可用下面的方法。

给定一个

vector v;
表达式v[0]生产一个指向vector中第一个元素的引用,所以,&v[0]是指向那个首元素的指针。vector中的元素被C++标准限定为存储在连续内存中,就像是一个数组,所以,如果我们想要传递v给这样的C风格的API:

void doSomething(const int* pInts, size_t numInts);
我们可以这么做:

doSomething(&v[0], v.size());
也许吧。可能吧。唯一的问题就是,如果v是空的。如果这样的话,v.size()是0,而&v[0]试图产生一个指向根本就不存在的东西的指针。这不是件好事。其结果未定义。一个较安全的方法是这样:

if (!v.empty()) {
doSomething(&v[0], v.size());
}

注意:

如果你在一个不好的环境中,你可能会碰到一些半吊子的人物,他们会告诉你说可以用v.begin()代替&v[0],因为(这些讨厌的家伙将会告 诉你)begin返回指向vector内部的迭代器,而对于vector,其迭代器实际上是指针。那经常是正确的,但正如条款50所说,并不总是如此,你 不该依赖于此。begin的返回类型是iterator,而不是一个指针,当你需要一个指向vector内部数据的指针时绝不该使用begin。如果你基 于某些原因决定键入v.begin(),就应该键入&*v.begin(),因为这将会产生和&v[0]相同的指针,这样可以让你有更多 的打字机会,而且让其他要弄懂你代码得人感觉到更晦涩。坦白地说,如果你正在和告诉你使用v.begin()代替&v[0]的人打交道的话,你该 重新考虑一下你的社交圈了。(译注:在VC6中,如果用v.begin()代替&v[0],编译器不会说什么,但在VC7和g++中这么做的话, 就会引发一个编译错误)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FLOWVERSE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值