首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在取消引用指向数组的指针时,我得到的地址与指向数组的指针的地址相同

在取消引用指向数组的指针时,得到的地址与指向数组的指针的地址相同,这是因为指针本身存储的是数组的首地址。

指针是一个变量,它存储了另一个变量的内存地址。在C语言中,数组名本身就是一个指向数组首元素的指针。当我们取消引用指向数组的指针时,实际上是获取该指针所指向的内存地址上的值。

假设有一个数组arr,其首地址为ptr。当我们使用*ptr来取消引用指向数组的指针时,得到的是数组的首元素的值。而当我们使用ptr来获取指针的地址时,得到的是数组的首地址,即ptr的值。

这种情况下,取消引用指向数组的指针得到的地址与指向数组的指针的地址相同,因为它们指向的是同一个内存地址。

这种操作在访问数组元素时非常常见,可以通过指针来遍历数组,或者通过指针进行数组元素的读取和修改操作。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++指向数组元素指针

C++指向数组元素指针 C++中,一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应地址指针变量既然可以指向变量,也可以指向数组元素,所谓数组元素指针就是数组元素地址...p=&array[0]; 和C语言一样,C++中,数组名代表数组中第一个元素地址,因此也可以这样写: p=&array[0]; p=array; 定义指针变量可以直接赋初值,p初值为array...[0]地址: int *p=&array[0]; 同样,也可以写成: int *p=array; 可以通过指针引用数组元素,假设p已定义为一个 基类型为整型指针变量,并已将一个整型数组元 素地址赋给了它...如果指针变量p已指向数组一个元素,则p+1指向同一数组下一个元素,p+i和array+i就是array[i]地址,或者说,它们指向array数组第i个元素。...指向数组元素指针变量也可以带下标,如p[i] * (p+i) 等价,引用一个数组元素,可用以下方法:  下标法,如array[i]形式 指针法,如*(a+i)或*(p+i)。

2.1K2319

c语言之指向二维数组元素指针变量

如何使用指针对二维数组进行遍历?...] = {4,5,6},我们知道,一维数组在内存中是连续一块内存,并且数组名a0,a1代表就是该数组首元素地址,而正因为二维数组内存中地址也是连续,所以a1首元素地址就为a0数组首元素地址...+a0中元素个数,因此,我们就可以通过让指针不断+1来访问其中每一个元素,不用再考虑行限制。...(2)传入printArr中是二维数组首元素地址,也就是第一个一维数组首元素地址,也就是其名字。...(3)遍历时让指针p一直向后移动到二维数组末尾,可以看做将二维数组展开成一维数组,再计算移动次数。 (4)当访问到位置是列整数倍,进行换行,方便显示。

1.2K20

《挑战30天C++入门极限》CC++中字符指针数组指向指针指针含义

C/C++中字符指针数组指向指针指针含义   就指向指针指针,很早以前在说指针时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针指针。   ...char* *b=a;//定义一个指向指针指针,并赋予指针数组地址指向第一个字符串地址也就是abc\0字符串地址 cout<<*b<<"|"<<*(b+1)<<...endl; } }   下面我们来仔细说明一下字符指针数组指向指针指针,段1中程序是下面的样子: char *a[]={"abc","cde","fgh"}; char*...,定义以后a[]其实内部有三个内存位置,分别存储了abc\0,cde\0,fgh\0,三个字符串起始地址,而这三个位置内存地址却不是这三个字符串起始地址,在这个例子中a[]是存储栈空间内,而三个字符串却是存储静态内存空间内...如果我们有一个int test(int a)函数,那么,它地址就是函数名字,这一点如同数组一样,数组名字就是数组起始地址

1.3K20

【C 语言】字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串指针 | 指向堆内存指针 )

文章目录 一、字符串 一级指针 内存模型 1、指定大小字符数组 2、未指定大小字符数组 3、指向常量字符串指针 4、指向堆内存指针 一、字符串 一级指针 内存模型 ---- #include <stdio.h..., 声明 数组 , 数组大小 5 字节 , 为其赋值 , 使用了 “abc” 字符串常量 ; 全局区 常量区 存放 “abc” 字符串常量 ; 使用 “abc” 常量为 数组 赋值 , 注意数组最后一位是...字节 ; // 栈内存数组 不指定大小 char array2[] = "123"; 3、指向常量字符串指针 栈内存 中 , 定义 局部变量 指针 p , 没有为该指针分配内存..., 该指针指向 字符串常量 “def” ; 全局区 常量区 中 , 定义 字符串常量 “def” ; // 定义指针 , 使用字符串赋值 char *p = "def"; 4...、指向堆内存指针 先在 堆内存 中 , 分配 5 字节内存 ; 然后 全局区 常量区 中 , 定义 字符串常量 “456” ; 最后 将 字符串常量 “456” 拷贝到 堆内存 分配 内存中

2.3K20

c语言之使用指针*和地址&二维数组中表示含义

假设有这么一个数组:int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}} 表示形式 含义 地址 a 二维数组名,指向一维数组a[0],即0行地址...假设首地址为2000 a[0], *(a+0) *a 0行0列元素地址 2000 a+1,&a[1] 第一行首地址 2016 a[1],*(a+1) 1行0列元素a[1][0]地址 2016 a[1]...是取地址意思,*是指向某元素地址,*(*())表示引用,即取得某指针指向值。...(2)二维数组在内存中是连续存储,因此a[1][0]地址是a[0][0]地址再加上a[0]里面元素个数×每个元素所占字节数,即2000+4×4=2016。...(3)二维数组名a表示是第0行地址,a[0]表示第0行第0列元素地址。(c语言中数组名就是其首元素地址)。 (4)a[i][j]表示第i行第j列值,用&可以得到地址

1.3K10

C++反汇编第三讲,反汇编中识别虚表指针,以及指向虚函数地址

C++反汇编第三讲,反汇编中识别虚表指针,以及指向虚函数地址 讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好,这里扣过来了...,虚表可以看做是一个数组     2.3虚表中存储是虚函数地址....我们构造时候,会填写虚表指针,然后核心代码就在上面 1.将对象存入一个局部变量保存 2.局部变量中转给eax 3.对eax取内容填写虚表地址. ...对其位置下一个引用图表,谁引用,则可以看到调用它所有构造以及析构了, 1.构造时候会填写虚表 2.析构时候会填写虚表 图表: ?...总结: 1.识别虚表指针可以构造中或者析构中查看   2.虚表指针双击过去则可以看到所有的虚函数地址   3.对虚表指针来个引用,(谁引用)可以看到所有的构造和析构 三丶识别虚函数调用

1.5K60

函数指针数组实现转移表应用:以计算器为例

函数指针数组         函数指针数组是C语言中一种数据结构,它由一系列指向函数指针组成。...C语言中,函数名代表函数地址,因此可以创建一个数组来存储这些地址(即函数指针),然后通过索引访问并调用相应函数。         ...它通过将每个分支逻辑封装成单独函数,并将这些函数地址存储一个数组中,从而避免了复杂if-else或switch-case语句。...具体来说,转移表工作原理是: 定义一系列相关函数:这些函数通常完成类似的任务,但行为根据某个特定条件有所不同。 创建一个函数指针数组数组每个元素都是一个指向上述函数指针。...这样做好处是,当需要添加新操作,只需添加一个新函数并将其地址添加到转移表中,而不需要修改现有的条件分支逻辑。

8910

计算机初级选手成长历程——指针(6)

我们可以很容易得到结论——数组指针存放指向对象地址; //数组指针创建初始化 int main() { int a = 10; int(*p)[1] = &a; return 0; }...数组指针区别主要由以下几点: 数组指针在内存中空间不相同 数组在内存中申请空间,申请是一片连续空间; 指针指向空间是内存空间中一块空间; 数组指针存储数据个数不同 数组在内存中会根据自己大小申请对应空间个数...; 数组指针在读取数据,是先通过存储指向空间起始地址找到对应空间起始位置,再通过空间编号找到对应空间,最后通过对该空间地址进行解引用找到空间中存储数据; 现在我们知道了指针数组数组指针是两个东西了...接下来我们就来探讨一下数组指针二级指针异同点; 15.5.3 数组指针二级指针 对于同为指针数组指针和二级指针来说,它们有很多相同地方: 内存中申请空间相同 对于指针来说,指针指向是对象地址...; 二级指针是通过两次解引用来找到对应数据,而数组指针通过空间编号找到对应空间这个过程就是一次解引用过程,所以两种指针寻找数据工作原理上是相同都是通过两次解引用来找到对象中存储数据; 但是二者又有很多不同地方

12710

C语言初阶——指针

既然指针这么强大,那么使用它肯定要谨慎,避免产生野指针指向位置不可知,即指针变量间强绑定关系不可控),野指针可能会内存泄露危害(如果野指针指向某个变量,并且野指针没被销毁,那么使用指针过程中可能误使用到野指针...: 1.指针创建最好初始化 2.指针使用时要观察是否会出现越界现象 3.当指针指向原空间被释放后,指针要及时置空(赋NULL) 4.避免指针指向局部变量地址 5.指针使用前检查有效性(类型是否匹配...&数组,取出是整个数组地址,进行指针运算,将直接跨过整个数组 //指针数组 int main() { int arr[5] = { 1,2,3,4,5 }; int* pa = arr...一级指针用来指向变量地址,二级指针则是指向一级指针地址,二级指针也能通过解引用两次方式远程控制变量。...,本质上仍是数组,不过因为数组中存储是元素地址,因此使用指针对其中元素进行访问,需要使用二级指针

12110

【C语言总集篇】指针篇——从不会到会过程

; 可以看到这个改变内容字节大小指针对应数据类型所占空间大小也是相同,也就是说,不同类型指针进行解引用操作是可以操作字节大小对应类型所占空间大小相同。...,既然是变量,那我创建,如果未给变量进行初始化,那么就会导致此时指针变量指向是一个随机地址,那如果要对这个随机地址进行解引用并对地址内容进行修改,那会出现什么情况呢?...通过数组来接收指针传参也是没有任何问题,这里我们看到数组接收完后,还能通过解引用操作符来访问指针指向各个对象; 经过上面的例子,相信大家对指针数组名之间相互转换已经非常熟悉了,下面给大家介绍一些关于指针数组之间有趣变形...如下所示: 在前面对指针数组探讨中我们得到结论是在对数组元素进行访问引用操作符*下标引用操作符[]。因此我们可以通过第二个下标引用操作符来访问指针数组中各元素数组元素。...接下来我们就来探讨一下数组指针二级指针异同点; 15.5.3 数组指针二级指针 对于同为指针数组指针和二级指针来说,它们有很多相同地方: 内存中申请空间相同 对于指针来说,指针指向是对象地址

20410

C 语言指针完全指南:创建、解除引用指针数组关系解析

指针变量指向一个数据类型(如 int)相同类型,并使用 * 运算符创建。...解除引用在上面的示例中,我们使用指针变量来获取变量内存地址 & 引用运算符一起使用)。...您还可以通过使用 * 运算符(取消引用运算符)获取指针指向变量值:int myAge = 43; // 变量声明int* ptr = &myAge; // 指针声明// 引用:使用指针输出 myAge...好吧, C 语言中,数组名称实际上是指向数组第一个元素指针。感到困惑?让我们试着更好地理解这一点,并再次使用上面的“内存地址示例”。...第一个元素内存地址数组名称相同:int myNumbers[4] = {25, 50, 75, 100};// 获取 myNumbers 数组内存地址printf("%p\n", myNumbers

27900

指针深入解读笔记

,而且32位平台下是4字节 64位平台下是8字节 而且指针大小与它所指向东西无关,只于它运行平台有关 指针类型意义 指针变量类型虽然大小无关,但是却决定每次或下次访问访问字节大小有关...而且还有一种特殊指针 void* 它是无具体类型指针(泛型指针),这种指针可以接收任何类型地址,但是不可以 + - 和 解引用 因为它无法确定 步长....地址 const char * pa ="wwww";//这个pa指向地址和pw相同 数组指针变量 int *pa[10];这个是指针数组 int (*pb)[10]; 这个是数组指针...int (*pb)[10] pa*结合说明p是一个指针变量变量,然后指向是一个大小为10个整型素组,p是指针,指向数组,所以是数组指针,( []优先级高于*,所以要用(...arr[5][i] 函数指针变量 在内存中创建自定义函数本身也是有地址,可以通过 &函数名 方式得到函数地址,如果我们要把函数地址存起来,就要创建函数指针变量,函数指针变量写法和数组指针类似

7600

第七节(指针

C程序中声明一个变量,编译器会预留一个内存位置来储存该变量,此位置有唯一地址。 编译器把该地址变量名相关联。当程序使用该变量名,将自动访问正确内存位置。...本例中,这两个值都是1。 第26行var前使用了取址运算符,该行打印var地址。 第27行打印指针变量ptr值,第26行打印相同。 该程序清单在认为是一个很好例子。...实际上,第4、5、6行第1、2、3行几乎分别相同。 区别在于,short类型数组x中,每个元素占2字节,而在float类型数组expenses 中,每个元素占4字节。...(3)其他指针运算: 使用指针,除了递增和递减,还会用到求差,即两个指针相减。 如果有两个指针指向相同数组不同元素,便可将两指针相减得出它们间隔。...(假设整型大小是2字节) 将两个指针相减得到他们之间之间元素个数,在这种情况下答案为1,数组元素实际大小无关。 14:假设上一题数组类型是float。两个指针相减得到多少?

17540

彻底弄懂C语言数组

只有两种情况下例外: 第一种是对数组名使用sizeof运算符 sizeof(a) 这将会得到整个数组所占内存大小,a是长度为10int(4字节)数组,运算结果是40 第二种是对数组名取地址 &a 运算结果是数组地址...注意,数组地址数组首元素地址是不同概念,尽管二者值是相同。 二、下标引用 除了上面说两种例外,其他情况下编译器都将数组名隐式转换成指针常量。...比如使用下标引用数组元素: a[3] // 自动转换成下面的表达式 *(a + 3) a值被转换成指针常量,指向第一个元素,向右移动3 * sizeof(int)个字节,然后解引用,便得到了第...接下来第四点会详细解释&a含义,这里先给出结论,&a是指向数组指针,而&a类型是int (*)[10]。...a 值是数组首元素地址,它并不是一个指针。 “取一个数组地址所产生是一个指向数组指针,而不是一个指向某个指针常量值指针”(出自《C和指针》第142页)。

49420

【C语言】深入解开指针(四)

str3 和 str4 是字符指针,它们都指向同一个字符串常量"hello bit."。字符串常量存储只读内存区域,无论如何定义,它们地址相同。...解释: 首先, pf3是一个函数指针变量,它指向Add函数。 C语言中,函数指针一般指针运算方式是一致。 也就是说,对函数指针进行解引用(*pf3)后结果,就是被指向函数本身。...函数指针一般指针语法上表现形式不同,但本质上都是指向函数地址指针。所以对函数指针进行解引用或直接调用效果是一致。...因此上述代码两种打印方式结果相同,原因就是函数指针普通指针语法和语义上是一致。...所以整个表达式: (void (*)())0 - 获取函数指针指向0地址引用函数指针得到匿名函数 () - 调用匿名函数 换句话说,这个代码是: 获取一个指向0地址函数指针,然后解引用得到一个匿名函数

10710

C语言指针5分钟教程

通过变量名字前使用&操作符,我们可以得到该变量内存地址。...val变量声明并初始化内存之后,通过变量名之前使用地址操作符&我们可以直接引用变量内存地址。 第8行,我们再一次使用*操作符来对该指针取值,可直接获得指针指向内存地址数据。...可以注意到,第11行我们打印了int和void指针地址。它们现在指向了同样内存地址。所有的指针都存储了内存地址。它们类型只 取值起作用。...也不可以将一个数组变量赋值给另一个数组。 然而,可以把一个数组变量赋值给指针,这一点似乎让人感到费解。把数组变量赋值给指针,实际上是把指向数组第一个元素地址赋给指针。...由于数组变量实际上是第一个元素地址,因此我们可以把这个地址赋值给指 针。这个赋值int *ptr = &myarray[0]效果相同,显示地把数组第一个元素地址赋值到了ptr引用

1K50

c++基础之字符串、向量和数组

vector 被定义头文件 vector 中 由于vector中存储是对象,而引用不是对象,所以不存在存储引用vector 定义和初始化 除了可以使用string相同初始化方法外,新标准还支持使用初始化列表来初始化...,其类型定义为difference_type 使用迭代器来访问元素使用指针访问指向对象方式一样,它重载了解引用运算符和箭头运算符。...使我们能够像使用指针那样使用迭代器 数组 数组vector相似 二者都是线性存储 二者存储都是相同类型元素 vector不同是: 数组大小固定 由于大小初始化就已经确定,所以性能上优于vector...某些时候使用数组时候,编译器会直接将它转化为指针,其中使用数组,编译器会自动转化为数组首元素地址。...这里我们将ai值赋值给指针循环中,外层循环用来找到ai数组中每个子数组指针。 内层循环中,使用pArr解引用得到指针指向每一个对象,也就是一个存储了4个整型元素数组

1.1K20
领券