-1

我已经阅读了指向数组 c++的指针 并对其进行了一些实验。

#include <iostream>
using namespace std;
int main()
{
    int g[] = {9,8};
    int (*j)[2] = &g;
    int *i = g;

    int n = (*j)[0];
    int m = *(i + 0);
    cout << "n:" << n << endl;
    cout <<"m:" << m << endl;
    cout << "=============" << endl;
    cout << "*(j):" << *(j) << endl;//9's address ???
    cout << "j:" << j << endl;//9's address ???
    cout << "&j:" << &j << endl;//what it is???
    cout << "&(*j)" << &(*j) << endl;//9's address ???
    cout << "=============" << endl;
    cout << "*(i):" << *(i) << endl;//get the value pointered by i
    cout << "i:" << i << endl;//i's value store g's address
    cout << "&i:" << &i << endl; //i's address
    cout << "&(*i):" << &(*i) << endl;//9's address
    cout << "=============" << endl;
    cout << "*(g):" << *(g) << endl;//get the value pointered by g
    cout << "g:" << g << endl;//g's value store 9's address
    cout << "&g:" << &g << endl;//9's address???
    cout << "&(*g):" << &(*g) << endl;//9's address
    return 0;
}

结果是:

n:9
m:9
=============
*(j):0x7fff56076bbc
j:0x7fff56076bbc
&j:0x7fff56076bb0
&(*j)0x7fff56076bbc
=============
*(i):9
i:0x7fff56076bbc
&i:0x7fff56076ba8
&(*i):0x7fff56076bbc
=============
*(g):9
g:0x7fff56076bbc
&g:0x7fff56076bbc
&(*g):0x7fff56076bbc
[Finished in 0.3s]

我想问的是:

1.为什么

    int (*j)[2] = &g;
    int *i = g;

如果我将其中一个更改为&ggg&g会产生编译错误,有什么区别?

(我认为数组名是一个指针,为什么我不能使用,它int (*j)[2] = g的含义是什么&g,它已经是一个指针,为什么还要获取地址?)

2.&g和既然g地址相同,为什么不能交换?

3. 为什么&g'值是9'地址?它存储自己的地址吗?

4. 你能解释一下j可变部分吗?我不明白为什么要j存储9's 地址并*(j)获取9's 地址,&(*j)还要获取9's 地址?

我现在对此感到非常困惑。我完全理解的是i可变部分, g可变部分对&g, 和jvarialbe 部分都感到困惑。int (*j)[2] = &g;部分也很混乱。

4

3 回答 3

1
  1. g 是变量(在本例中为数组), &g 是变量的地址(在本例中为数组开头的地址。您可能会理解,但编译器不会,因此它会给您一个错误。

  2. 如果您愿意进行类型转换,它们可能可以交换,但在这种情况下这不是一个好主意。

  3. 因为 g 是整数数组,并且该数组的第一个(第 0 个)元素的地址恰好是整个数组的地址。这没有道理吗?

  4. j 在您的情况下是指向数组的指针,当然它也是指向具有该数组的第 0 个元素的地址的指针(根据定义)

于 2013-10-27T14:14:55.937 回答
1

(*j)[2]是指向 2 个整数数组的指针。换句话说,它(几乎)与指向整数的指针等效。该行int (*j)[2] = g;尝试将类型不匹配分配int*(int**)哪个。该行int *i = &g;尝试再次分配int**类型int*不匹配。

(I think that the array name is a pointer, so why cannot I use int (*j)[2] = g and what is the meaning of &g, it is a pointer already, why get address again?)

什么地址?在其类型检查中,C++ 区分不同类型变量的地址,因此即使int*int**都是地址(指针),它们也指向不同的类型。

于 2013-10-27T14:36:00.650 回答
1

你可以看看这篇文章来理解为什么g&g持有相同的地址:

数组名称如何具有其地址以及其中的第一个元素?

当您将其中任何一个更改为时,编译器会抱怨,g因为&g存在类型不匹配。这意味着在语义上,g并且&g具有不同的含义,即使它们可能引用相同的东西:g,当在表达式中使用时,衰减为指向 int ( int *) 的指针,但&g它是指向 2 个 int 数组的指针类型。这些不是兼容的类型;您不能将指向 int 数组的指针分配给指向 int 的指针(反之亦然)。

g已经是指针的声明是错误的:g是一个数组。在表达式中使用时,它衰减为指向数组第一个元素的指针。指针只是保存地址的东西。数组一个地址(它的第一个元素的地址)。使用&g,您将获得指向数组的指针,但不会获得指向指针的指针,因为使用引用运算符时数组不会衰减为指针。可以这样想:如果一个数组是一个地址,那么应用“address of”运算符 - &- 会产生相同的地址,按照惯例,它是第一个元素的地址。当您不应用&运算符时,在表达式中,数组衰减为指向第一个元素的指针,然后再次 - 它指向第一个元素,与 相同的地址&g

于 2013-10-27T14:44:38.823 回答