关于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 &t2
$2 = (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
相关文章
|
11月前
|
缓存 安全 编译器
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
《C++面试冲刺周刊》第三期聚焦指针与引用的区别,从青铜到王者级别面试回答解析,助你21天系统备战,直击高频考点,提升实战能力,轻松应对大厂C++面试。
929 132
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
|
11月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
777 12
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
344 0
|
Python Windows
[oeasy]python076_int这个词怎么来的_[词根溯源]整数类型_int_integer_touch
本文探讨了“int”一词的起源及其与整数类型的关联。通过词根溯源,揭示“int”来源于“integer”,意为“完整的数”,与零碎的分数相对。同时分析了相关词汇如“tact”(接触)、“touch”(触摸)及衍生词,如“tangential”(切线的)、“intagible”(无形的)和“integral”(完整的、不可或缺的)。文章还结合编程语言特性,解释了Python作为动态类型、强类型语言的特点,并总结了整型变量的概念与意义。最后预告了后续内容,提供了学习资源链接。
556 11
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
396 1
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
858 4
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
2082 13