有没有人对指针算术有任何好的文章或解释(博客,例子)?图中的观众是一群学习C和C++的Java程序员.
假设我有一些T必须N字节对齐的类型.现在我声明一个类型的数组T:
T array[size];
Run Code Online (Sandbox Code Playgroud)
阵列是否具有与类型相同的对齐要求,T还是具有任何其他对齐要求?
C++标准[sec 5.7]说:
如果指针操作数和结果指向相同的数组对象,或一个过去的数组对象的最后一个元素的元素两者,所述评估也不得产生溢出; 否则,行为未定义.
那么,我是否正确地假设其他类型的指针比数组未定义?
例如:
int a = 0;
vector<int> v(&a, (&a)+1);
Run Code Online (Sandbox Code Playgroud)
上面的代码片段编译并且工作正常(使用g ++),但它是否有效?
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[101][101];
a[2][0]=10;
cout<<a+2<<endl;
cout<<*(a+2)<<endl;
cout<<*(*(a+2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么a + 2和*(a + 2)的值相同?提前致谢!
我想要进一步了解,并可能澄清一些让我对 C++ 中的数组和指针感到困惑的事情。让我困惑的主要事情之一是,当您引用数组的名称时,它可能是指该数组,或者是指向第一个元素的指针,以及其他一些东西。为了更好地显示我的理解困难来自哪里,我将显示几行代码,以及我从每行代码中得出的结论。
假设我有
int vals[] = {1,50,3,28,32,500};
int* valptr = vals;
Run Code Online (Sandbox Code Playgroud)
因为 vals 是指向数组第一个值的指针,所以这意味着 valptr 作为一个整体应该等于 vals,因为我只是将一个指针设置为等于一个指针,例如 1=1。
cout<<vals<<endl;
cout<<&vals<<endl;
cout<<*(&vals)<<endl;
cout<<valptr<<endl;
Run Code Online (Sandbox Code Playgroud)
上面的代码打印出相同的值,这让我得出两件事的结论,一是 valptr 和 vals 相等,并且可以以相同的方式处理,另一个事实是,由于某种原因,将 & 和 * 添加到vals 似乎没有指代任何不同的东西,这意味着以这种方式使用它们是没有用的,因为它们都指的是相同的值。
cout<<valptr[1]<<endl;//outputs 50
cout<<vals[1]<<endl;//outputs 50
cout<<*vals<<endl;//outputs 1
cout<<*valptr<<endl;//outputs 1
Run Code Online (Sandbox Code Playgroud)
上面的代码进一步加深了我的心态,valptr 和 vals 是相同的,每当我对 vals 执行某些操作,并对 valptr 执行相同的操作时,它们都会产生相同的结果
cout<<*(&valptr +1)-valptr<<endl;
cout<<endl;
cout<< *(&vals + 1) -vals<<endl;
Run Code Online (Sandbox Code Playgroud)
现在我们已经确定了我所知道的,或者我可能有的误解,现在我们继续讨论我遇到的两个主要问题,我们现在将讨论这些问题。
我的第一个困惑是cout<< *(&vals + 1) -vals<<endl;我知道这输出了数组的大小,以及它如何工作的一般概念,但我对几个部分感到困惑。如前所述,如果
cout<<vals<<endl;
cout<<&vals<<endl;
cout<<*(&vals)<<endl;
Run Code Online (Sandbox Code Playgroud)
全部打印出相同的值,为什么我需要 * 和 & ,cout<< *(&vals + 1) -vals<<endl;我知道如果我这样做,vals+1 …