#include <iostream>
#include <string>
#include <vector>
usingnamespace std;int main()
{int t = 10; //t: 左值 int t2 = t + 1; //t: 右值 int a = 1; constint &b = a + 1; // 左值引用
// int &b = a + 1; // 错误 cout << b << "" << a << endl;int c = 1;int &&c2 = c + 1; // 右值引用...
一、指向数组的指针代码示例1:
1int main()
2{
3int a[10]={0,2,4,6,8,10,12,14,16,18};
4int *p;
5for(p=&a[0];p<&a[0]+10;p++)
6 printf("%d ",*p);
7 }代码示例2:
int a[10]={0,2,4,6,8,10,12,14,16,18};
int *p;
p=a;
printf("%d\n",*(a+5));//注意加括号,否则就是输出“a指向的值加5”了int sum(int *a,int n)
{int ans=0;for(int i=1;i<=n;i++)ans+=a[i];return ans;
} 二、指向字符串的指针示例代码:
1char *ps...
//引用复习
#include<iostream>
using namespace std;
void show1()
{
cout << "show1" << endl;
}
void show2()
{
cout << "show2" << endl;
}
void show3()
{
cout << "show3" << endl;
}
int main()
{
int one = 1;
int &r1(one); //左值引用,引用的内存实体
int &&r2(one+1);//右值引用,引用的寄存器中的值
int &&r3(move(one));//move 可以把左值作为右值引用
cout << one << " " << r1 <<...
一句话总结指针分配内存,有地址(编译器和程序员看来),属于一个类型变量,支持取地址与解引用操作。引用分配内存,有地址(编译器看来),相当于一个变量别名,不支持取地址与解引用操作(即不可获取其本身地址),声明即必须初始化,不可变更引用对象,本质上是“pointer const”。推荐阅读快速理解:简谈 C++ 中指针与引用的底层实现原文:https://www.cnblogs.com/MinPage/p/14662084.html
为什么C/C++语言使用指针?答案:①一方面,每一种编程语言都使用指针。不止C/C++使用指针。每一种编程语言都使用指针。C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来了。“Everything uses pointers. C++ just exposes them rather than hiding them,” It‘s easier to give someone an address to your home than to give a copy of your home to everyone.②另一方面使用指针的优点和必要性:指针能够有效...
引用很容易与指针混淆,它们之间有三个主要的不同:不存在空引用。引用必须连接到一块合法的内存。一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。引用必须在创建时被初始化。指针可以在任何时间被初始化。原文:https://www.cnblogs.com/0patrick/p/13121415.html
面试一:指针与引用的区别?答案:(1)非空区别。在任何情况下都不能使用指向空值的引用。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高。(2)合法性区别...
前面两节,说明了右值引用和它的作用。下面通过一个string类的编写,来说明右值引用的使用。相对于C++98,主要是多了移动构造函数和移动赋值运算符。先给出一个简要的声明:class String
{
public:String();String(constchar *s); //转化语义String(const String &s);String(String &&s);~String();String &operator=(const String &s);String &operator=(String &&s);friend ostream &operator<<(ostream &os, const String &s){r...
new 运算符1、指针变量 = new 数据类型, 如:int *p; p=new int;2、new从内存中卫程序分配一块内存空间,并返回指向该内存的首地址,该地址存放于指针变量中new 先分配内存,做复杂类型的构造delete 释放delete运算符delete 指针变量; 如:delete p;(1)用new获取内存空间,必须用delete进行释放(2)对一个指针只能调用一次delete(3)用delete运算符作用的对象必须是用new分配的内存间的首地址注:C语言中有free()函数分配...
1、左值和右值的概念 左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体; 右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。 一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。2、引用 引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量的别名。 引用可以改变指针的指向,还可以改变指针所...
数组指针是指一个指向数组的指针,例如有一个数组指针p指向一个数组a[],则 *p是取到这个数组,也就是说 *p=a,因此 **p =a[0],它的定义为:int a[10];
int (*c)[10]=&a;(*c)表示它是一个指针,若不加括号则变成 指针数组 ,[10]表示指向一个长度为10的数组,int 表示数组元素为int因为函数不能返回数组,所以可以设置返回一个数组指针,即auto fo2(int (&a)[10]) -> int (*)[10]{a[5]=10;return &a;
}int (&a)[10] 是一个数组引用...
C++11中引入的一个非常重要的概念就是右值引用。理解右值引用是学习“移动语义”(move semantics)的基础。而要理解右值引用,就必须先区分左值与右值。注意:左值右值翻译可能有些问题*L-value中的L指的是location,表示可寻址。*R-value中的R指的是read,表示可读。 对左值和右值的一个最常见的误解是:赋值运算符左边的就是左值,赋值运算符右边的就是右值。左值和右值都是针对表达式而言的,左值是指表达式结束后依然存在...
右值引用和移动操作是C++11提出的新概念,通过这些操作,可以降低拷贝操作带来的消耗。先来简单介绍一下左值和右值。左值一般指的是一个对象,或者说是一个持久的值,例如赋值的返回值、下标操作、解引用以及前置递增等。右值是一个短暂的值,比如一个表达式的求值结果、函数返回值以及一个字面值等。 为了区分,把一般的引用称为左值引用,必须绑定到右值的引用称为右值引用,以&&表示。右值引用有这两个特性:右值引用只能绑定到...
C++引用(Reference)引用(Reference)是C++语言相对于C语言的又一个扩充,是C++常用的一个重要内容之一。类似于指针,只是在声明的时候用"&"取代了"*"。正确、灵活地使用引用,可以使程序简洁、高效。我在工作中发现,许多人使用它仅仅 是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有搞清本源。故在本篇中我将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖 引玉的作用。引用 引用是别名,在声...
1. 几种智能指针1. auto_ptr: c++11中推荐不使用他(放弃)2. shared_ptr: 每添加一次引用 就+1,减少一次引用,就-1;做到指针进行共享3. unique_ptr: 一个指针同时只能有一个使用者使用4. weaked_ptr: 与shared_ptr搭配使用1.1 weak_ptr参考:https://zh.cppreference.com/w/cpp/memory/weak_ptrstd::weak_ptr 是一种智能指针,它对被 std::shared_ptr 管理的对象存在 非拥有性(“弱”)引用。在访问所引用的对象前必须 先转换为 ...