关于C/C++ int (*t5)[3] 指针类型说明

简介: 程序如下:  8 #include   9 #include  10 using namespace std;  11   12   13 int main(void)  14 {  15     unsigned int *t1 = new uns...
程序如下: 

8 #include<iostream>
  9 #include <unistd.h>
 10 using namespace std;
 11 
 12 
 13 int main(void)
 14 {
 15     unsigned int *t1 = new unsigned int[10];
 16     unsigned int t2[3]={1,2,3};
 17     unsigned int *t3;
 18     short       *t4 = new short;
 19     
 20     t3=t2;
 21     cout<< "dymic array szie is p t1:"<<sizeof(t1)<<endl;//不能对动态素组进行 他返回是指针的大小
 22     cout<< "dymic short szie is p t4:"<<sizeof(t4)<<endl;//不能对动态分配short进行sizeof 他返回是指针的大小
 23     cout<< "static array size if p t2"<<sizeof(t2)<<endl;
 24     cout<< "static array pointer to t2 is p3 "<<sizeof(t3)<<endl;//不能对指向静态指向的素组使用sizeof 他返回是指针的大小
 25 
 26     delete t4;
 27     delete [] t1;
 28 
 29     unsigned int (*t5)[3];                                                                                                                                          
 30     t5 = &t2;
 31     t2+1;  //step is 4
 32     t5+1;  //step is 4*3=12 
 33 
 34     sleep(10);
 35 
 36 
 37 }

我们知道C/C++中数组的名字是指向数组第一个元素的指针,确实如此,我们可以*(p+1)来获取下一个元素
考虑这里的
 29     unsigned int (*t5)[3];                                                                                                                                          
 30     t5 = &t2;
 31     t2+1;  //step is 4
 32     t5+1;  //step is 4*3=12 

 
unsigned int t2[3]={1,2,3}; 是一个素组,那么t2是数组的名称也是他的首地址
t5 = &t2;如果解释呢其实如果我们这里将t2作为素组的名称,那么&t2就是素组
的起始位置,他和t2视乎有相同的地址,但是
t2+1 
t5+1
他们的步长不同前者是4 后者这是这个素组的长度4*3
那么我们如何声明t5这种类型的指针,起始就是  int (*t5)[3];
他表明t5是一个指向3个int元素数组的首地址的指针。
可以用GDB进行调试

(gdb) p t2+1
1 = (unsigned int *) 0x7fffffffea14  (gdb) p &t22 = (unsigned int (*)[3]) 0x7fffffffea10
(gdb) p t5+1
$3 = (unsigned int (*)[3]) 0x7fffffffea1c
(gdb) 
是不是看得很清楚
 &t2为 0x7fffffffea10 t2+1为 0x7fffffffea14 t5+1为 0x7fffffffea1c
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
打赏
0
0
0
0
91
分享
相关文章
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
119 1
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
108 0
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
286 4
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
74 2
|
5月前
|
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
143 1
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
331 13
|
5月前
|
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
65 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等