C++ 之 数组名和指针

本文探讨了数组名和指针在C++中的使用差异,包括它们的特性、如何通过sizeof运算符获取长度,以及在不同数据类型下数组名的表现。特别指出,在char类型下,数组名可能显示为内容而非地址。

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

在很多情况下,可以相同的方式使用数组名和地址

区别之一是:

可以修改指针的值  而数组名是常量不可修改

另一个区别:

对数组应该 sizeof 运算符得到的是数组的长度

对指针应用 sizeof 得到的是指针的长度

 

特点:

数组名被解释为其第一个元素的地址    而数组名应用地址运算符时,得到的是整个数组的地址

例如:

int main(void)
{
    int num[16]={1,2,3,4,5,6,7,8,9,0};//num是数组num的第一个元素的地址
    
    int (*pnum)[16]=#             //pnum 是数组的地址

     //对数组名(数组第一个元素的地址)+1 得到:地址自加类型字节数的长度
    //对数组地址  +1   得到:数组元素个数程序类型的长度

    cout<<"num:  "<<num<<"  num+1:  "<<num+1<<endl;

    cout<<"&num:  "<<&num<<"  &num+1:  "<<&num+1<<endl;

     return 0;

}

运行结果为:

可知:从 00FCFD08 到 00FCFD0C 增加4

           从00FCFD08 到 00FCFD48 增加了 64 个字节 

因为元素个数为16:  即 4*16=64 字节(使用十六进制的地址显示)

 

但是  数组名显示的一定是地址吗? 答案是不一定!!!

反例:

int main(void)
{


	char str[16] = { "abcd" };   //使用char类型 创建 数组 长度为16

	char(*pstr)[16] = &str;      //将数组地址赋值给 pstr


	cout << str << "  " << pstr << endl;        //输出 str第一个元素地址  以及  数组地址

	cout << str + 1 << "  " << pstr + 1 << endl;    //+1  再次输出

	return 0;

}

运行结果:

可见:

当类型为 char时 则数组名输出的是 char数组的内容  而&str 输出的是数组的地址

+1 后输出 便将地址的长度往后推移再次输出cahr数组的内容  而&str输出的是16*1=16个字节(使用十六进制的地址显示)

所以:当类型为char时显示的并非地址 而是数组的内容!

原因是:char类型的数组名是第一个元素的地址,打印时 cout<<对char数组进行 了特殊处理  因为字符串常量也是地址

因此所要输出字符串的地址应为:

int main(void)
{


	char str[16] = { "abcd" };   //使用char类型 创建 数组 长度为16

	char(*pstr)[16] = &str;      //将数组地址赋值给 pstr


	cout << str << "  " << (int*)str << "   " << pstr << endl;        //输出 str第一个元素地址  以及  数组地址

	cout << str + 1 << "  " << (int*)(str + 1) << "   " << pstr + 1 << endl;    //+1  再次输出

	return 0;

}

 

### 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、付费专栏及课程。

余额充值