打印指针指针

时间:2013-07-09 05:54:56

标签: c pointers

我想要打印时打印3.我不明白我只增加一次的原因。如果这是正确使用指针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)));



}

6 个答案:

答案 0 :(得分:6)

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

实际存储在a[0]中的是指向int的指针,而不是指向int的指针。这是错误的,编译器应该已经警告过你。在您的体系结构上,似乎指针的大小是int的两倍,因此增量++*a将两个整数的大小添加到指针,因此a [0]处的值(如果解释为{{1})而不是int*,跳过2。

要获得结果,您希望将其声明为int **的数组。

int *

答案 1 :(得分:2)

  • *a = *(a + 0) = a[0]包含地址= a3int*(在您的代码a[0] = a3;中)。

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

  • 通过执行a1,您指向++(*a)中位于索引a1的下一个元素,并在1处使用*++(*a)数组中打印1索引值,输出:a1那是2

所以,a1[1]实际上是*(++(*a))

您打印代码打印a1[1]而不是2,请在codepade

处查看您的工作代码

答案 2 :(得分:2)

a[0] = &a3;
a[1] = &a4;

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

根据定义,a应该包含指向int指针的指针。所以需要添加&amp;在a3和a4前面。在printf中,为了相同的原因,在递增之前需要使用去引用两次。

答案 3 :(得分:2)

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

a的声明更改为

int* a[2];

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

答案 4 :(得分:0)

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

所以,

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

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

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

答案 5 :(得分: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;
}