[Js-c++]c++中的指针、引用和数组名

指针和引用学了好久,还是偶尔会弄混淆,简单记录分析一下区别吧,有记起来新的区别就不断更新添加进去

1、指针可以多次重新分配,引用在无法重新分配,而且必须在声明的时候被初始化

2、指针可以指向空(即被定义为nullptr),但是引用必须指向一个东西

3、不存在“引用计算”这种东西(但是你用 &d+5 这种的确不会报错,也能算出来东西)

4、一个指针在堆栈上有自己的内存地址和大小(x86上有4个字节),而引用共享相同的内存地址(与原始变量),但是也占用堆栈上的一些空间。由于引用具有与原始变量本身相同的地址,因此可以安全地将引用视为同一变量的另一个名称。注意:指针指向的内容可以位于堆栈或堆上。同上参考。我在这个陈述中的主张并不是指针必须指向堆栈。指针只是一个保存内存地址的变量。这个变量在堆栈中。由于引用在堆栈上有自己的空间,并且地址与其引用的变量相同。更多关于堆栈vs堆。这意味着有一个编译器不会告诉你的引用的真实地址。

我们默认的一种规则:

  · 在函数参数和返回类型中使用引用来提供有用和自我记录的接口。

  · 使用指针来实现算法和数据结构。

有关于数组名和指针:

表达式中的数组名被编译器当作一个指向该数组第一个元素的指针。

下标总是与指针的偏移量相同.

在函数参数的声明中,数组名被编译器当作指向该数组的第一个元素的指针(换言之,在函数调用的时候数组名会退化成指针,但是 sizeof 函数取数组大小的时候不是这样)。

有关数组名,指针,以及引用的加法:

数组名和指针都可以做算术运算(但实际上乘除法应该是没有意义的),但是数组名做完运算不能赋值回去,指针则可以(换言之,对于数组不能使用名自增自减运算符)

假设有一个数组 a[10]

1 /*
2 a:          0012FF20
3 &a:         0012FF20
4 a+1:        0012FF24
5 &a+1:       0012FF48
6 */  

a和&a指向的是同一块地址,但他们+1后的效果不同,a+1是一个元素的内存大小(增加4),而&a+1增加的是整个数组的内存大小(增加40)

&a取都得是整个数组的地址!既数组名取地址等价于对数组取地址。(而不是想象中的,数组名是指针,给指针取地址就是指针的指针)

目前还没看到要用到&a这种写法的地方

原文地址:https://www.cnblogs.com/jiasq/p/9200701.html

时间: 2024-10-13 17:49:06

[Js-c++]c++中的指针、引用和数组名的相关文章

返回“字符串常量的指针”和“返回数组名”的区别

char*getmemory(void) { char p[]=”hello world”; return p; } void test(void) { char *str=NULL; str=getmemory(); printf(str); } 问:运行Test 函数会有什么样的结果? 由于数组p是栈上数据,返回数组名就是返回栈内存即动态数据区的地址,函数结束会被释放,所以返回的地址也就指向了不确定的位置了,str就成了乱码! 如果改成: char*getmemory(void) { cha

jsp的C标签一般使用方法以及js接收servlet中的对象及对象数字

jsp的C标签一般使用方法以及js接收servlet中的对象及对象数组 由于现流行的javaWeb框架提倡前后端分离,比如在SpringMvc中已经很少写servlet的一些东西:目前 前端jsp中大多是一些纯html和js,很少用到jstl的一堆东西,后端也仅仅处理一些前端的post.get请求或页面跳转,无须以往繁琐的xml路径映射和filter过滤. 不过有时也会用到servlet作用域中的一些东西,比如某个固定的值.上下文路径等等~,不过这些东西大多数也仅限于取值而不是设置值(或对象),

5数组指针和引用:数组

数组 一维数组:数据类型  数组名 [常量表达式] 注意: 命名规则和变量名相同 数组后面一定是[],方括号内 是常量表达式 常量表达式表达元素的个数,即数组的长度 定义数组的常量表达式不能是变量 引用: 一维数组引用的一般形式:数组名[下标] 数组元素的下标起始值为0 初始化: 单个元素逐一赋值   a[10]=1;a[9]=100;...... 聚合方式赋值    int a[10]={1,2,.....10} ; int a[]={1,2,.....10}  ; int a[10]={1,

第二章 数组名是一个指针常量吗?

数组名是一个指针常量这种观点来源于数组名在表达式计算中与指针的结果等效性.例如下面的代码: int a[10], *p = a, *q; q = a + 1; q = p + 1; 在效果上看,a + 1与 p + 1是相同的,这很容易给人一种a就是p的假象,但,这仅仅是假象.鉴于指针常量包含了指针和常量两类概念,我们可以把这个问题分开两部分进行讨论. 一.数组名是指针吗? 在<C与指针>一书中,作者用一个著名的例子阐述了数组名与指针的不同.在一个文件中定义:int a[10];然后在另一个文

c/c++数组名和指针区别深入探索

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针".很幸运,我的大学老师就是其中之一.时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解. 想必这种误解的根源在于国内某著名的C程序设计教程.如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,

数组名和指针的深入理解(C++)

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了. 魔幻数组名 请看程序(本文程序在WIN32平台下编译): #include <iostream> using namespace std; int main() { char str[10]; char* pStr = str; cout << "sizeof(str): \t" << sizeof(str) <&

向函数中传递指针和传递指针的引用的区别

如果是传递指针,那么会先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针:但 是对于传递指针应用,如果将传递进来的指针指向了新的对象,那么原始的指针也就指向了新的对象,这样就会造成内存泄漏,因为原来指针指向的地方已经不能再 引用了,即使没有将传递进来的指针指向新的对象,而是在函数结束的时候释放了指针,那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了 看个例子: #includ

#详解C++中的指针与引用

指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作.但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此介绍一下指针和引用,力争将最真实的一面展现给大家. 1.指针和引用的定义 在深入介绍之前我们首先来看一下指针和引用的定义.指针和引用的区别,然后分别针对指针和引用展开讨论,深入细节为何有这些差异. 指针的权威定义: In a declaration T D where D has the form * cv-qualifier-seqopt

C++中的指针和引用

此文来自Listening_music:   http://blog.csdn.net/listening_music/article/details/6921608 感谢作者提供的美文,本人很受用,谢谢! 1.指针和引用的定义 下面用通俗易懂的话来概述一下指针和引用: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图,所示指针的含义: 引用-引用是一个对象的别名,主要用于函数