1.以下代码是正确的:
int main(int argc, char **argv)
{
int a[2] = {7,8};
cout << a << endl;
int * c ;
c = a;
//cout << c << endl;
system("pause");
return 0;
}
2.以下代码是错误的:会报错。
int main(int argc, char **argv)
{
int b[2][2] = { 2 , 3,4,5 };
cout << b << endl;
int * c ;
c = b;
//cout << c << endl;
system("pause");
return 0;
}
这是为什么呢?
正确的解释:
c是指向整型的指针
b是数组的数组,会隐含转换为指向第一个数组的指针(常量)
*b是取消引用,这就得到的是第一个数组,和上面一行一样,此时*b还会隐含转换,转换为第一个整型元素的指针(常量),这样就和c的类型一样了。
这里的赋值有两次数组名向指针的隐含转换
因为b[2][2]是两个一维数组因此我们可以得到:
cout << *(b +1) << endl; // b代表第1个一维数组的首地址,b+1代表第2个一维数组的首地址 *(b+1)代表第2个数组第1个元素的地址。
cout << &b[1][0] << endl; // 取b[1][0]的地址
cout << (*b )+1 << endl; // b代表第1个一维数组的首地址,*b代表第1个一维数组的第一个元素的地址 (*b)+1代表地1个一维数组第2个元素的首地址。
cout << &b[0][1] << endl;
前两个输出的值一样,后两个输出的值一样。
因此,可以用不同方式得到数组中不同的值。
int main(int argc, char **argv)
{
int a[2] = {7,8};
cout << a << endl;
int * c ;
c = a;
//cout << c << endl;
system("pause");
return 0;
}
2.以下代码是错误的:会报错。
int main(int argc, char **argv)
{
int b[2][2] = { 2 , 3,4,5 };
cout << b << endl;
int * c ;
c = b;
//cout << c << endl;
system("pause");
return 0;
}
这是为什么呢?
正确的解释:
c是指向整型的指针
b是数组的数组,会隐含转换为指向第一个数组的指针(常量)
*b是取消引用,这就得到的是第一个数组,和上面一行一样,此时*b还会隐含转换,转换为第一个整型元素的指针(常量),这样就和c的类型一样了。
这里的赋值有两次数组名向指针的隐含转换
因为b[2][2]是两个一维数组因此我们可以得到:
cout << *(b +1) << endl; // b代表第1个一维数组的首地址,b+1代表第2个一维数组的首地址 *(b+1)代表第2个数组第1个元素的地址。
cout << &b[1][0] << endl; // 取b[1][0]的地址
cout << (*b )+1 << endl; // b代表第1个一维数组的首地址,*b代表第1个一维数组的第一个元素的地址 (*b)+1代表地1个一维数组第2个元素的首地址。
cout << &b[0][1] << endl;
前两个输出的值一样,后两个输出的值一样。
因此,可以用不同方式得到数组中不同的值。