- 主题:求教求教指针
闲得蛋疼,折腾点事
int arr[4] = { 13, 12, 21, 30 }; //这是一个数组
int(*ptr)[4] = &arr; //这是指向数组的指针
for(int offSet=0; offSet<4, ++offSet)
{
std::cout << ptr + offSet << *(ptr + offSet) << std::endl;
}
比较的结果,ptr + offSet 与*(ptr + offSet)输出都是地址,且两者每次输出结果都一毛一样,求问一下为什么?
--
修改:wanllow FROM 45.78.56.*
FROM 45.78.56.*
重要的事情再说一遍:语法细节分析,此类问题chatgpt最拿手!
你好!在C++中对指针的操作有时候可能会有些让人困惑。首先,有一点小错误需要更正,代码中的&intArray应该是指向你创建的数组arr的地址,所以应该写作&arr。以下是更正后的代码:
int arr[4] = { 13, 12, 21, 30 }; // 这是一个数组
int(*ptr)[4] = &arr; // 这是指向4个整数数组的指针
for(int offSet = 0; offSet < 4; ++offSet)
{
std::cout << ptr + offSet << " " << *(ptr + offSet) << std::endl;
}
现在我来解释一下你的疑问。
在这段代码中,ptr是一个指向整个数组的指针,而不是数组中某一个元素的指针。当你执行ptr + offSet,由于ptr的类型是指向一个包含4个整数的数组的指针,所以加上偏移量offSet之后,它实际上是移动到了数组的下一个地址,这个地址是按照整个数组的大小来计算的,即offSet * sizeof(arr)。由于数组是连续内存,所以这个计算出来的地址实际上超出了原始数组arr的内存范围。
而*(ptr + offSet)语法上看着是解引用的操作,但由于ptr指向的是整个数组,这里解引用并不会给你一个具体的arr数组中的值,而是得到一个指向偏移后的数组(如果它存在的话)的指针。所以这里你得到的还是一个地址,这个地址是ptr + offSet计算得到的地址。这也就是为什么ptr + offSet和*(ptr + offSet)看起来输出的是相同的地址。
如果你的目的是遍历数组arr中的每个元素,那么不应该使用类型为int(*)[4]的指针。更直接的方式是使用一个指向int类型的指针,像这样:
int arr[4] = { 13, 12, 21, 30 };
int *p = arr; // 或者 int *p = &arr[0];
for(int offSet = 0; offSet < 4; ++offSet)
{
std::cout << p + offSet << " " << *(p + offSet) << std::endl;
}
在这段代码中,p + offSet将会给出第offSet个元素的地址,而*(p + offSet)将会给出第offSet个元素的值。
--
FROM 221.220.171.*
似乎明白了,感谢!
【 在 z16166 的大作中提到: 】
: 重要的事情再说一遍:语法细节分析,此类问题chatgpt最拿手!
: 你好!在C++中对指针的操作有时候可能会有些让人困惑。首先,有一点小错误需要更正,代码中的&intArray应该是指向你创建的数组arr的地址,所以应该写作&arr。以下是更正后的代码:
: int arr[4] = { 13, 12, 21, 30 }; // 这是一个数组
: ...................
--
FROM 45.78.56.*
一个是数组指针一个是数组,数组会转换成数组元素的指针
--
FROM 223.104.240.*
【 在 wanllow 的大作中提到: 】
: 闲得蛋疼,折腾点事
: int arr[4] = { 13, 12, 21, 30 }; //这是一个数组
: int(*ptr)[4] = &arr; //这是指向数组的指针
: ...................
你这是指针, 数组指针, 数组地址和下标地址计算不是太清楚, 还有字符数组,字符串指针,
这些语言层面, 是很微妙的。
下面例子可能更清晰点:
#include <iostream>
using namespace std;
char arr[4] = { 'a', 'b', 'c', 'd' }; //这是一个数组
char arr2[4] = { 'x', 'y', 'z', '\0' }; //这是一个数组
char(*ptr)[4] = &arr; //这是指向数组的指针
char * pheader = (char*)&arr[0];
int main()
{
std::cout << ptr <<" "<<*pheader<<" "<<pheader<<endl;
for(int offSet=0; offSet<4; ++offSet)
{
std::cout << ptr + offSet<<" "<< *(ptr + offSet) <<" "<< (ptr + offSet)[0] << std::endl;
}
return 0;
}
0x404050 a abcdxyz
0x404050 abcdxyz abcdxyz
0x404054 xyz xyz
0x404058 P@@ P@@
0x40405c
--
FROM 124.126.0.*
【 在 z16166 的大作中提到: 】
: 重要的事情再说一遍:语法细节分析,此类问题chatgpt最拿手!
: 你好!在C++中对指针的操作有时候可能会有些让人困惑。首先,有一点小错误需要更正,代码中的&intArray应该是指向你创建的数组arr的地址,所以应该写作&arr。以下是更正后的代码:
: int arr[4] = { 13, 12, 21, 30 }; // 这是一个数组
: ...................
好老师。
--
FROM 221.221.51.*