-6

它打印 3 而我想打印 2。当我只增加一次时,我不明白原因。还让我知道这是否正确使用指针 t 指针?我刚刚制作了一个示例代码来查看指向指针的指针是如何工作的。

#include<stdio.h>
void main(){
int a1[] = {1,2,3,4,5,6};
int a2[] = {7,8,9,10,11,12};
int *a3 = a1;
int *a4 = a2;
int **a[2];
a[0] = a3;
a[1] = a4;

printf("%d",*(++(*a)));



}
4

6 回答 6

6

您将 a 声明为 的数组int**,因此*a不是指向 int 的指针,而是指向指向 int 的指针。递增指针会增加它指向的数据类型的大小,因此++*a将 at 的值a[0]增加指针的大小。

您实际存储的a[0]是指向 int 的指针,而不是指向 int 的指针。这是错误的,编译器应该警告你这一点。在您的架构上,指针似乎是 int 大小的两倍,因此增量++*a将两个 int 的大小添加到指针,因此如果将 a[0] 处的值解释为int*而不是int **,则跳过 2。

要获得您期望的结果,请将 a 声明为int *.

int *a[2];
于 2013-07-09T06:15:00.410 回答
2
  • *a= *(a + 0)= a[0]包含地址 = a3int*(在您的代码中a[0] = a3;)。

  • a3指向a1(在您的代码int *a3 = a1;中,即一个)的第一个元素,因此*a指向 of 的第一个元素a1

  • 通过这样做++(*a),您将指向a1索引处的下一个元素1,最后使用*at++(*a)您正在输出的数组 中打印1索引值:那 就是a12a1[1]

所以,*(++(*a))其实a1[1]

您的代码打印23,请在此处查看您在codepade的工作代码

于 2013-07-09T06:08:58.530 回答
2
a[0] = &a3;
a[1] = &a4;

printf("%d",*(++(**a)));

根据定义, a 应该包含指向 int 指针的指针。所以需要在a3和a4前面加上&。在 printf 中,出于同样的原因,在递增之前需要使用两次取消引用。

于 2013-07-09T06:13:18.970 回答
2

您显然正在使用具有 64 位指针和 32 位整数的编译器。因为您声明a不正确,所以当您递增时,*a您是在递增指针的大小——64 位,即 8 个字节——而不是 int 的大小——32 位,即 4 个字节——所以有效地你增加两个整数的大小。

将声明更改a

int* a[2];

并且您的程序将正常运行。此外,使用 -Wall (至少)编译以获得警告。

于 2013-07-09T06:28:24.660 回答
0

您正在增加指针本身并再次打印它..

所以,

printf("%d",*(++(*a)));//would print 2

printf("%d",*(++(*a)));//would print 3

你应该使用*((*a)+1)

于 2013-07-09T06:07:08.290 回答
0
#include<stdio.h>

int main(void)
{
    int a1[] = {1,2,3,4,5,6};
    int a2[] = {7,8,9,10,11,12};
    int *a3 = a1;
    int *a4 = a2;
    int **a[2];
    a[0] = &a3; // a3 is a pointer, so take its address to get a pointer to pointer
    a[1] = &a4; // same here

    printf("%d",*(*(a[0])+1)); // PRINTS 2
    printf("%d",*(*(a[1])+1)); // PRINTS 8

    return 0;
}
于 2013-07-09T06:20:25.187 回答