C++中的数组和指针

博客主要对比了C++和Java中数组类型的不同。C++是强类型语言,数组类型与元素类型和个数相关,不能作为函数参数、返回值及typeid参数;而Java中数组类型统一为Array。还介绍了C++中指向数组的指针的定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++中的数组和指针
 
先看两个定义(声明)
int* aryp[10];
int (*pary)[10];
 
aryp 是一个10个元素的数组,数组中元素类型为int*
pary 是一个指针,是指向数组的指针,这个被指的数组的类型为 int[10]
这样看pary的定义会clear一点
 
typdef int INT_ARY_TEN[10];
INT_ARY_TEN* pary;
 
C++是一种强类型(strong typed)语言,C++中有一组特殊的type:数组
数组的类型不单只跟元素的类型相关,还与元素的个数相关。
int aten[10];
int anine[9];
 
则 aten 的type 和 anine 的type 是不一样的,
aten的类型为 int[10], anine的类型为 int[9],而不是通常认为的int* const,
尽管我们确实可以把它当作int* const 用。这点跟Java不一样,在Java中他们两的类型都是Array
 
数组类型还有一个特殊之处,他们不能作为函数的参数和返回值类型
void foo(int arg[10]) {
}
arg的类型其实是int* const,跟那个10一点关系也没有,甚至[]里不写任何东西都没有关系。
这也是为什么有人说数组名就是常量指针的原因。
 
除了函数,数组还不能作为typeid的参数
typeid(aten).name() 是会返回 "int*" 的
正是因为这个原因
typeid(aten) == typeid(anine) 会返回true
aten, anine在传进去的时候,类型都变成 int* const了 (typeid不记录常量信息,所以cosnt去掉了)
 
既然数组也是一种类型,则由*操作符就可以定义另外一种类型:指向数组的指针,例如开始的那个pary,可以这样定义
 
int (*pary)[10] = &aten;
int (*pary)[10] = &anine; 是不合法的。
编译器抱怨说:cannot convert from 'int (*)[9]' to 'int (*)[10]'
### C++数组指针指针数组的区别 #### 指针数组 指针数组是一个数组,其元素都是指针类型的变量。这意味着每一个元素都可以存储一个地址。声明指针数组时需要指定数组的大小以及指针所指向的数据类型。 ```cpp int* ptrArray[10]; // 声明了一个含有10个整数指针数组[^1] ``` 上述代码创建了一个名为 `ptrArray` 的数组,它可以保存十个指向整型数据的指针。每个指针可以独立地指向不同的内存位置。 #### 数组指针 数组指针则是指向整个数组指针。为了声明这种类型的指针,应该把星号放在圆括号内紧挨着指针名称之前,这样表明这是一个指向特定长度数组指针而不是简单的指针数组。 ```cpp int (*arrPtr)[4]; // 创建一个指向四个整数构成的数组指针[^2] ``` 这里定义了 `arrPtr` 是一个指向由四个连续整数组成的一维数组指针。当初始化或赋值给这类指针时,通常传入的是某个实际一维或多维数组的名字作为右操作数。 #### 使用差异 对于 **指针数组** 来说,可以通过遍历的方式逐个访问各个指针成员并间接获取它们指向的对象: ```cpp for (size_t i = 0; i < sizeof(ptrArray)/sizeof(*ptrArray); ++i){ std::cout << *ptrArray[i] << ' '; } std::cout << '\n'; ``` 而对于 **数组指针**, 若要访问被指向的数组的内容,则需先解引用得到首元素的位置再进一步索引: ```cpp // 初始化一些测试数据 int data[] = {1, 2, 3, 4}; arrPtr = &data; // 访问第一个元素 std::cout << (**arrPtr) << "\n"; // 或者使用偏移量来访问其他元素 std::cout << (*(arrPtr))[2] << "\n"; // 输出第三个元素(下标从零开始计) ``` 需要注意的是,在处理数组指针的时候一定要确保不会发生越界读写行为,因为这可能导致程序崩溃或者其他未定义的行为[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值