一维数组
问以下代码的输出:
#include<iostream>
using namespace std;
int main()
{
int a[5] = { 1,2,3,4,5 };
int* ptr = (int*)(&a + 1);
cout << *(a + 1) << endl;
cout << *(ptr - 1) << endl;
return 0;
}
A:输出2,1
B:输出2,5
C:输出1,2
D:都不正确
解析:首先a是一个int型数组,所以变量a是指向数组a的指针,则*(a+1)=2;
&a是取地址运算符,&a+1则是指向int数组的末尾的地址,则ptr指针则是指向a数组的末尾的指针,所以*(ptr-1)=5。故选B
注意:
#include<iostream>
using namespace std;
int main()
{
int a[5] = { 1,2,3,4,5 };
int* ptr = a;
cout << *(ptr+1) << endl;
return 0;
}
这个程序的输出是2,因为ptr指针是指向数字2的指针,而不是5后面的数字。
两句红色的地方是关键,第一句红色是引用,,第二局红色是指针。当引用+1时,加的是整个变量的大小,所以会指向int数组的末尾;当指针变量+1时,地址值加的是指针变量的大小。
#include<iostream>
using namespace std;
int main()
{
int a[5] = { 1,2,3,4,5 };
int* ptr = a;
cout << a << " " << ptr + 1 << endl;
cout << a << " " << &a + 1 << endl;
return 0;
}
对于ptr+1的地址值是a的地址值+4(int 4个字节),&a+1的地址值是a的地址值+20
对于二维数组
#include<stdio.h>
int main()
{
char arr[][3] = { 'a','b','c','d','e','f','g'};
int a[][5] = { 1,2,3,4,5,6,7,8,9,10};
printf("%p\n", a);
printf("%p\n", a + 1);
printf("%p\n", (&a + 1));
return 0;
}
a是一个2行5列数组,a是一个指向数组的指针,a+1的地址值指向第一行的末尾,(&a+1)则指向数组a的末尾